求教一个 js 的问题,入门菜鸡

2021-04-28 09:34:22 +08:00
 zmz980126

大概场景就是有一段源代码,不修改它

//源代码
...
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 的运行时代码吗?

感谢~

3524 次点击
所在节点    JavaScript
27 条回复
yunyuyuan
2021-04-28 09:39:34 +08:00
有点不知所云
xiaoxinshiwo
2021-04-28 09:43:57 +08:00
回调函数
kop1989
2021-04-28 09:44:20 +08:00
我揣测一下,看到 lz 说先执行 b,lz 是不是想讨论 b 是异步的问题。

假设 a 、b 都是同步(同线程)的情况下:
a();b();输出 333 。

假设 a 、b 是异步的情况下:
用 promise 或者 async 、await 语法糖。
joesonw
2021-04-28 09:44:42 +08:00
var _a = a; a = function() { _a(); b(); }
kop1989
2021-04-28 09:45:44 +08:00
如果不太懂 promise 或者 async 、await,也可以按照#2 说的,b 的传入参数里加入 callback 函数。
既把执行完 b 需要做的代码直接当作参数传入 b 。b 最后执行。
Kasumi20
2021-04-28 09:53:02 +08:00
你要是能把 a()改成下面这样的话,我还有点办法
window.a = function (){
console.log("111");
}
shakukansp
2021-04-28 09:53:11 +08:00
第一种情况先执行 A 再执行 B 只要改成 promise 或者 async await 就行了
第二种情况可以用修饰器
@b
function a() {}
让 b 在 a 之前执行
touchwithe
2021-04-28 09:55:08 +08:00
这不就是 py 中的装饰器么?参考四楼,把 a 覆盖就行了
Biwood
2021-04-28 10:45:05 +08:00
函数劫持,见 4 楼
AsisA
2021-04-28 11:05:15 +08:00
1. 控制执行顺序的话,如果是同步代码,那么直接按照执行顺序排列函数调用顺序就行
2. 如果是异步代码,可以用 Promise,Async/Await,Rxjs 等方案
3. 第三个问题用装饰器即可
yamedie
2021-04-28 11:17:30 +08:00
面向切面编程
yaphets666
2021-04-28 12:08:37 +08:00
js 考察代码执行顺序的都是在考察微任务宏任务 event loop 不是用 settimeout 就是用 promise 解决
DrakeXiang
2021-04-28 12:46:38 +08:00
楼主说的是有一段源代码不能修改,然后加新代码在源代码顺序执行的过程中插入执行,这是不可能的
ciaoly
2021-04-28 13:02:33 +08:00
或许可以通过 window 的某些事件实现吧。。。
Augi
2021-04-28 13:23:52 +08:00
无论怎么样,必须在源代码上做修改。
hronro
2021-04-28 13:54:21 +08:00
想在运行时修改原函数内的代码,这是不可能的。
如果真的可以做到,那所有的广告 JS SDK 都可以去修改网站本身的函数,给里面注入各种后门,那得多可怕。
unco020511
2021-04-28 15:07:27 +08:00
如果是 java,可以用切面或者热修复之类的,但是 js,我就不知道有没有这中操作了
nekochyan
2021-04-28 15:20:56 +08:00
如果你能在 b 中拿到 a 这个对象 这就好办,就像四楼一样,拿不到那就没办法
lllllliu
2021-04-28 16:54:01 +08:00
责任链包装一哈。一路 next,
使用或者不是使用箭头函数改变上下文。
gesse
2021-04-28 17:33:15 +08:00
@kop1989
你太高看楼主了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/773759

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX