代码如下:
var fun = function(){console.log("fun!")};
var fun1 = function(){console.log("fun1!")};
function run(fun){
setTimeout(function(){
fun();
},1000);
}
run(fun);
fun = fun1;
现在想把回调fun在run执行过程中动态改变为fun1, 但是fun = fun1覆盖的方式没有生效
这是什么原因呢? 传引用的话覆盖以后fun的函数地址应该是更新的啊。
如何修改?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
每一个函数都有一个作用域,在将函数添加到执行栈中的时候,函数里的各个变量到底是什么就已经决定了(除去一些动态的情况,比如this,比如你在函数中去取外部作用域的值或者页面上的元素)。你将fun传给run,run的形参fun就指向了外部的fun函数,即这时候有两个引用指向该函数。当你改变外部fun的指向的时候,函数内的fun指向并没有改变。
所以,只要确保run函数内的fun指向始终指向外部就可以的。改法如下:
这是我根据@ne_smalltown提供的方法修改的方法,一定程度上消除了耦合, 而且体现了JS中对象作为参数传递的
传引用的副本按对象共享传递的特性。@ycwalker你这写法其实是个
闭包,fun传进去后,就成了内层函数的私有静态变量了,外部没法改变fun的值。