一:下面看一个腾讯面试题,主要知识是Js的线程问题。(有删减)
var cnt = 0;
for(var i = 0; i < 10; ++i) {
setTimeout(function() {
cnt += i;
}, 0);
}
setTimeout(function(){
console.log(cnt);
}, 0);
由于Js是单线程,遇到循环的时候setTimeout会在循环结束后才执行,所以cnt所加的i总是10,最后cnt的值是100。
var cnt = 0;
for(var i = 0; i < 10; ++i) {
setTimeout(function() {
cnt += i;
}, 0);
}
console.log(cnt);
稍作改动,代码的运行结果是0,很容易理解。
二:向 setTimeout 传递字符串字面量
var s = 1;
function test()
{
var s = 2;
setTimeout('console.log(s)', 0);
}
function test2()
{
var s = 2;
setTimeout(function(){
console.log(s);
}, 0);
}
test();
test2();
传入字符串字面量时,字面量会在全局作用域内被解析,所以上面输出 1 和 2 ;