Javascript 将变量传递给setTimeout()

Javascript 将变量传递给setTimeout(),javascript,asynchronous,settimeout,Javascript,Asynchronous,Settimeout,我不熟悉异步javascript。 我意识到代码A和代码B的工作原理是一样的 代码A: const name = ['a','b','c']; setTimeout(()=>{ console.log(name); },1500) 代码B: const name = ['a','b','c']; setTimeout(list=>{ console.log(list); },1500,name) 我们应该使用代码A还是代码B,在异步方面哪个更好 如果我们可以直接在se

我不熟悉异步javascript。 我意识到代码A和代码B的工作原理是一样的

代码A:

const name = ['a','b','c'];
setTimeout(()=>{
   console.log(name);
},1500)
代码B:

const name = ['a','b','c'];
setTimeout(list=>{
   console.log(list);
},1500,name)
  • 我们应该使用代码A还是代码B,在异步方面哪个更好
  • 如果我们可以直接在setTimeout()中使用在setTimeout()外部声明的变量,为什么我们要将它们作为第三个或第四个参数等传递到setTimeout()中

  • 您可能希望传入参数的原因是,在创建超时时,这些参数是按照它们的状态传递的。举例来说,考虑这些例子:

    const name=['a','b','c'];
    设i=0;
    while(i
    你应该选择代码B, 只是补充说明一下

    (函数(){
    常量名称=['a','b','c'];
    常量name2=[1,2,3];
    设置超时((测试)=>{
    log(test,name2);//这里我正在打印test,它作为参数传递。
    },1500,姓名);
    
    })();后一种情况基本上是多余的。如果您要使用
    setTimeout
    本身来传递参数,您也可以使用
    setTimeout(console.log,1500,name)
    。回答1。-也不它们基本上是一样的。代码A最多可以保护它,但并不总是需要它。后者较短,在某些情况下更容易阅读。在某些情况下存在差异,比较
    foo=1;setTimeout(()=>foo=42100);setTimeout(()=>console.log(foo),500)
    foo=1;setTimeout(()=>foo=42100);setTimeout(console.log,500,foo)这只适用于原语,如果你传递一个对象,它会改变(它的内容)。这是…构造的。用
    表示(设i=0;i@cy3er区别不在于“原语与对象”-这是变量是否被重新分配的问题。那么,为什么B更好呢?在这种情况下,两者的工作原理是一样的。但是,这并不总是一样的-如果您想在打印时打印变量的分配值,那么通过
    setTimeout
    传递变量将不起作用,因为它会给您调用
    setTimeout
    时的值*。对于一些示例,这可能会有什么不同-特别是
    foo
    bar
    。您在这里展示了一个我不推荐的版本:使用setTimeout将参数传递到一个匿名函数中。这样一来,您就把阅读此代码的人弄糊涂了您可以使用一个带有闭包的匿名函数
    var foo=…;setTimeout(()=>{/*use foo*/},1500);
    或者将回调函数和参数传递给setTimeout,比如
    setTimeout(callback,1500,…argsForCallback);