
大概场景就是有一段源代码,不修改它
//源代码 ... function a(){ console.log("111"); } ... a(); console.log("333"); ... //新代码 function b(){ console.log("222"); } 大概就是想在 a 调用完立刻调用 b 输出结果顺序为 111 222 333
扩展一步,如果是调用前能办到吗,即在执行 a 前先把 b 执行
(不知道 a 被调用了几次,但想把 b 绑定在 a 上)
可以在 b 中直接修改 a 的运行时代码吗?
感谢~
1 yunyuyuan 2021-04-28 09:39:34 +08:00 有点不知所云 |
2 xiaoxinshiwo 2021-04-28 09:43:57 +08:00 回调函数 |
3 kop1989 2021-04-28 09:44:20 +08:00 我揣测一下,看到 lz 说先执行 b,lz 是不是想讨论 b 是异步的问题。 假设 a 、b 都是同步(同线程)的情况下: a();b();输出 333 。 假设 a 、b 是异步的情况下: 用 promise 或者 async 、await 语法糖。 |
4 joesonw 2021-04-28 09:44:42 +08:00 var _a = a; a = function() { _a(); b(); } |
5 kop1989 2021-04-28 09:45:44 +08:00 如果不太懂 promise 或者 async 、await,也可以按照#2 说的,b 的传入参数里加入 callback 函数。 既把执行完 b 需要做的代码直接当作参数传入 b 。b 最后执行。 |
6 Kasumi20 2021-04-28 09:53:02 +08:00 你要是能把 a()改成下面这样的话,我还有点办法 window.a = function (){ console.log("111"); } |
7 shakukansp 2021-04-28 09:53:11 +08:00 |
8 touchwithe 2021-04-28 09:55:08 +08:00 via iPhone 这不就是 py 中的装饰器么?参考四楼,把 a 覆盖就行了 |
9 Biwood 2021-04-28 10:45:05 +08:00 via iPhone 函数劫持,见 4 楼 |
10 AsisA 2021-04-28 11:05:15 +08:00 1. 控制执行顺序的话,如果是同步代码,那么直接按照执行顺序排列函数调用顺序就行 2. 如果是异步代码,可以用 Promise,Async/Await,Rxjs 等方案 3. 第三个问题用装饰器即可 |
11 yamedie 2021-04-28 11:17:30 +08:00 面向切面编程 |
12 yaphets666 2021-04-28 12:08:37 +08:00 js 考察代码执行顺序的都是在考察微任务宏任务 event loop 不是用 settimeout 就是用 promise 解决 |
13 DrakeXiang 2021-04-28 12:46:38 +08:00 楼主说的是有一段源代码不能修改,然后加新代码在源代码顺序执行的过程中插入执行,这是不可能的 |
14 ciaoly 2021-04-28 13:02:33 +08:00 via Android 或许可以通过 window 的某些事件实现吧。。。 |
15 Augi 2021-04-28 13:23:52 +08:00 via iPhone 无论怎么样,必须在源代码上做修改。 |
16 hronro 2021-04-28 13:54:21 +08:00 想在运行时修改原函数内的代码,这是不可能的。 如果真的可以做到,那所有的广告 JS SDK 都可以去修改网站本身的函数,给里面注入各种后门,那得多可怕。 |
17 unco020511 2021-04-28 15:07:27 +08:00 如果是 java,可以用切面或者热修复之类的,但是 js,我就不知道有没有这中操作了 |
18 nekochyan 2021-04-28 15:20:56 +08:00 如果你能在 b 中拿到 a 这个对象 这就好办,就像四楼一样,拿不到那就没办法 |
19 lllllliu 2021-04-28 16:54:01 +08:00 责任链包装一哈。一路 next, 使用或者不是使用箭头函数改变上下文。 |
24 zmz980126 OP 其实最初的场景是一个课程学习网站,每过一段时间会出现一个确认框确认你是否真的在看,挺烦人,所以我就写了个油猴脚本(因为刚开始学 js 想试试),就遇到了这个问题想在它每次执行 showwarn()后执行一个 onclick 的 unshow() (当然,原来的函数名肯定不叫这个) ,最后没解决,就每隔一段时间 t 检测一下,那个改变的 html 元素,然后改变就 unshow,感觉写的很蠢 如果 t 太长,那如果出现确认框说不定也要等很长时间,如果 t 太短那就会一直执行这个检测,感觉很影响效率(且蠢) 然后就有了这个问题 |
25 xingheng 2021-04-29 13:27:55 +08:00 function decorator |
26 oldshensheep 2021-04-29 14:54:04 +08:00 MutationObserver 可以监听 dom 的变化,然后调用你的 unshow()函数就行了 https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver/MutationObserver 如果你一开始把你要干什么说出来大家就明白了。 如果不修改 a 的话应该不能实现你的要求。 |
27 KiZuNaYa 2021-04-29 16:20:08 +08:00 加个定时器不就好了? |