如何传递的参数时使用的setTimeout调用的函数?(How can I pass an argu

2019-09-17 04:49发布

我想传递的参数时使用调用的函数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); }

这表明2undefined1中的Internet Explorer 9。

方法1:很显然,我不希望通过它(当然简单的整数的情况下)后改变了说法。

方法2:这将是完美的,如果只有Internet Explorer支持它。

方法3:这似乎是唯一的选择。 但似乎不是别人少漂亮,传递的东西进行评估,而不是功能。

有没有更好的办法?

Answer 1:

我能想到的最好的解决办法是使用bind()

A = 1;
setTimeout(whatsA.bind(this, A), 100);

因为bind()实际上是一个函数调用,它读取当前A值,并返回与结合作为一个参数,值的函数。 如果你觉得很难理解,试试这个:

var newFun = whatsA.bind(this, 42);
newFun()

请注意, this是种在这里的谎言-你可以安全地通过window为好。


第一种方法是可以接受的,它只是需要稍微改善:

A = 1;
var tmpA = A;
setTimeout(function() { whatsA(tmpA); }, 100);

你所观察到实际上是一个功能,而不是一个错误。 你传递一个闭包setTimeout()引用局部变量。 JavaScript是足够聪明的延迟访问变量最多时的瞬间功能实际上是调用。 既然你已经修改了变量,你看到的最新版本。


第二种方法已被弃用 不会在任何浏览器中工作


第三种方法是可怕的,避免将字符串setTimeout()总是有一个更好的解决方案。



Answer 2:

你可以使用封闭:

setTimeout((function(A){
               return function(){
                   whatsA(A);
               }; 
            })(A), 100);


Answer 3:

您的三种方法:

选项1:

setTimeout(function() { whatsA(A); }, 100);

这一次的作品无处不在,也很简单。 这就是我建议除非该变量A被称为setTimeout函数之前可能会改变。 如果您需要冻结的价值A ,然后请参阅下面我的选择4。


选项2:

setTimeout(whatsA, 100, A);

这只能在某些浏览器。 不建议。


方案3:

setTimeout('whatsA(' + A + ')', 100);

这是从来没有建议。 构建代码作为一个字符串,然后后来评估它几乎从来都不是最好的解决方案。


我会推荐方案四

要冻结的价值A ,您可以创建使用自执行功能的关闭:

A = 1;

function(A) {
    setTimeout(function() {whatsA(A);}, 100);
}(A);

A = 2;
function whatsA(X) { console.log(X); }


文章来源: How can I pass an argument to a function called using setTimeout?