Mar*_*ark 6 javascript closures scope settimeout
我想将一个参数传递给一个名为using的函数setTimeout.我找到了这三个选项:
A = 1;
// Method 1: closure things
setTimeout(function() { whatsA(A); }, 100);
// Method 2: third argument (same result with [A])
setTimeout(whatsA, 100, A);
// Method 3: eval
setTimeout('whatsA(' + A + ')', 100);
A = 2;
function whatsA(X) { console.log(X); }
Run Code Online (Sandbox Code Playgroud)
这在Internet Explorer 9中显示2,undefined和1.
方法1:显然,我不希望在传递之后更改参数(当然在简单整数的情况下).
方法2:如果只有Internet Explorer支持它,这将是完美的.
方法3:这似乎是唯一的选择.但它看起来并不像其他人那么漂亮,传递的东西要被评估而不是功能.
有没有更好的办法?
我能想到的最佳解决方案是使用bind():
A = 1;
setTimeout(whatsA.bind(this, A), 100);
Run Code Online (Sandbox Code Playgroud)
因为bind()它实际上是一个函数调用,它会读取当前A值并返回一个函数,该值将该值绑定为参数.如果您发现难以理解,请尝试以下方法:
var newFun = whatsA.bind(this, 42);
newFun()
Run Code Online (Sandbox Code Playgroud)
请注意,this这里有点谎言 - 您也可以安全地通过window.
第一种方法也可以接受,只需稍加改进:
A = 1;
var tmpA = A;
setTimeout(function() { whatsA(tmpA); }, 100);
Run Code Online (Sandbox Code Playgroud)
你观察到的实际上是一个特征,而不是一个bug.您正在传递闭包以setTimeout()引用局部变量.JavaScript非常聪明,可以在实际调用函数之前延迟对该变量的访问.由于您已修改变量,因此您会看到最新版本.
第二种方法已弃用 将无法在任何浏览器中工作.
第三种方法很糟糕,避免传递字符串setTimeout(),总有一个更好的解决方案.
| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |