涉及setTimeout时,词汇作用域在这里如何工作?

请考虑以下代码:

function foo (){

 var count = 40;
 setTimeout(function bar(){
   console.log(count)
 })
 count = 50;
}

foo();

此将正确打印50,这很好。但是,如果我只是将count作为参数传递给函数bar,它将打印undefined。为什么它不从其词法范围中取值?

function foo (){

 var count = 40;
 setTimeout(function bar(count){
   console.log(count)
 })
 count = 50;
}

foo(); //Prints undefined
回答如下:

在第一种情况下,您的函数具有要计数的闭包,并且由于setTimeout回调在赋值之后运行,因此您会看到值50。

在第二种情况下,您的函数接受一个称为count的参数。该参数比闭包更强大,并且由于您没有将其传递给函数,因此它是未定义的。

涉及setTimeout时,词汇作用域在这里如何工作?

请考虑以下代码:

function foo (){

 var count = 40;
 setTimeout(function bar(){
   console.log(count)
 })
 count = 50;
}

foo();

此将正确打印50,这很好。但是,如果我只是将count作为参数传递给函数bar,它将打印undefined。为什么它不从其词法范围中取值?

function foo (){

 var count = 40;
 setTimeout(function bar(count){
   console.log(count)
 })
 count = 50;
}

foo(); //Prints undefined
回答如下:

在第一种情况下,您的函数具有要计数的闭包,并且由于setTimeout回调在赋值之后运行,因此您会看到值50。

在第二种情况下,您的函数接受一个称为count的参数。该参数比闭包更强大,并且由于您没有将其传递给函数,因此它是未定义的。