我想将参数传递给名为 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); }
由此可见2
, undefined
, and 1
在 Internet Explorer 9 中。
Method 1:显然,我不希望参数在传递后被更改(当然在简单整数的情况下)。
Method 2:如果只有 Internet Explorer 支持就完美了。
Method 3: 这似乎是唯一的选择。但它似乎比其他的不太漂亮,传递的是要评估的东西而不是函数。
有没有更好的办法?
我能想到的最好的解决方案是使用bind()
:
A = 1;
setTimeout(whatsA.bind(this, A), 100);
Because bind()
实际上是一个函数调用,它读取当前的A
value 并返回一个以该值作为参数的函数。如果你觉得很难理解,可以试试这个:
var newFun = whatsA.bind(this, 42);
newFun()
注意this
这里有点谎言——你可以安全地通过window
以及。
第一种方法也可以接受,只是需要稍微改进一下:
A = 1;
var tmpA = A;
setTimeout(function() { whatsA(tmpA); }, 100);
您所观察到的实际上是一个功能,而不是一个错误。您正在将一个闭包传递给setTimeout()
引用局部变量。 JavaScript 足够聪明,可以将对变量的访问延迟到实际调用函数的那一刻。由于您修改了变量,因此您会看到最新版本。
The second method is deprecated won't work in any browser.
第三种方法很糟糕,避免将字符串传递给setTimeout()
,总有更好的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)