更新时间:2022-10-15 09:10:26
第一个问题,第一个循环时,是
setTimeout(function(){console.log('a')},1000*1);
这是对setTimeout的一次调用,结果就是把function在1000*1毫秒后扔到任务队列去。
循环第二轮继续,这个时候是在1000*2毫秒后扔到任务队列去,这里的j跟function里用变量j是不一样的,function是后面可以调用时发现自己里面并没有j的声明才去外层作用域找变量j,此时j=10;可每次循环中调用setTimeout其实就是一个function的普通调用过程,正如:
function normal(n){
console.log(n);
}
for(var i=0;i<10;i++){
normal(i*1000);
}
这样对比例子,能明白吧?
第二个问题呢,跟上一个问题我觉得是类似的。
setTimeout(console.log(j),1000*j);
正常来说,setTimeout的第一个参数要求是function,当然也可以是别的,具体看 https://developer.mozilla.org...
但这里不涉及到这setTimeout的定义范畴了。
其实换个写法:
function normal(n){
console.log('i am called');
}
for(var i=0;i<10;i++){
normal(console.log(i));
}
当在调用normal方法的时候,首先参数里面是一个函数的执行,注意是执行,而不是什么匿名函数的声明之类的。
所以第一步是先执行掉参数里面的'执行函数',得到函数执行的值,然后作为参数传入到方法中去。
这样说,题主能理解不?