【发布时间】:2017-01-08 08:58:18
【问题描述】:
您能解释一下这 3 段代码之间的区别吗?它们看起来和我一模一样,但输出不同。
1:
var i;
function print(){return function(){console.log(b)}};
function doSetTimeout(b){setTimeout(print(),2000);};
for(i=0;i<10;i++){doSetTimeout(i)}
2:
var i;
function print(){console.log(b)};
function doSetTimeout(b){setTimeout(print,2000);};
for(i=0;i<10;i++){doSetTimeout(i)}
3:
var i;
function doSetTimeout(b){setTimeout(function(){console.log(b)},2000);};
for(i=0;i<10;i++){doSetTimeout(i)}
前 2 个返回未定义的 b,而第 3 个返回预期值。
【问题讨论】:
-
顺便说一句,块语句后不需要冒号,如
{}; -
在 1 和 2 中,您没有将
b传递给 print 函数 -
你可以把
print移动到doSetTimeout里面,那么b是一个局部变量。
标签: javascript variables scope closures