由于某些原因,文章已经删除,打算迁移到别处,目前正在寻找更合适的平台。
请大家关注我的新公众号ar_indus,随后我会在公众号里推送新的博客地址。
后续计划的《react进阶系列》文章也会在新公众号中推送。
公众号二维码
ar_indus由于某些原因,文章已经删除,打算迁移到别处,目前正在寻找更合适的平台。
请大家关注我的新公众号ar_indus,随后我会在公众号里推送新的博客地址。
后续计划的《react进阶系列》文章也会在新公众号中推送。
公众号二维码
ar_indus本文标题:图例详解那道setTimeout与循环闭包的经典面试题
本文链接:https://www.haomeiwen.com/subject/neptgttx.html
网友评论
是恢复中状态,请问怎么才能访问呢
setTimeout( function timer() {
console.log(i);
}, i*1000 );
}直接讲var给成let就解决了
(function(j) {
var value = i;
setTimeout( function timer() {
console.log(value);
}, i*1000 );
})(i)
}
fn.toString = function(){
return 30;
};
.toString是啥意思?事件吗?把函数变成字符串?
return 30;
}
这一句会对代码有什么影响不懂,求大神解释一下啊
for循环里定义了5个setTimeout的闭包。而当这些操作开始执行时,for循环的i值难道不是已经先一步变成了6了么。所以将i值保存在闭包里面的不也是6么
for (var i=1; i<=5; i++) {
setTimeout( (function(i) {
return function() {
console.log(i);
}
})(i), i*1000 );
}
setTimeout(clock(i),i*1000);
function clock(i){
console.log(i)
}
} ,这样也可以
“ 而这个队列执行的时间,需要等待到函数调用栈清空之后才开始执行。”
函数调用栈应该很没有算清空吧,不是还有栈底的全局上下文吗?
for (var i=1; i<=5; i++) {
setTimeout( (function(i) {
//return function() {
console.log(i);
//}
})(i), i*1000 );
}
代码的i值还是可以访问到(说明访问到i的正确值不是闭包的关系),但是不能隔一秒输出一次,而是所有的console被立即执行了。
所以我认为您上述给出的两种解决方法都很好,但是闭包和IIFE在其中起到的作用我不是很认同。如果我的认识有不对的地方,欢迎纠正我的认识。
for (var i = 1; i <= 5; i++) {
setTimeout((function(i) {
console.log(i);
})(i), i * 1000);
}
火狐:
undefined
function fn()
function fn()
setTImeout 10ms.
setTimeout 20ms.
360:
undefined
fn() {
setTimeout(function() {
console.log('setTImeout 10ms.');
}, 10);
}
function 30
10
setTImeout 10ms.
setTimeout 20ms.
谷歌:
undefined
function 30
function 30
10
setTImeout 10ms.
setTimeout 20ms.
不用去纠结具体的优先级
console.log(a);
}, 0);
var a = 10;
console.log(b);
console.log(fn);
var b = 20;
function fn() {
setTimeout(function() {
console.log('setTImeout 10ms.');
}, 10);
}
fn.toString = function() {
return 30;
}
console.log(fn);
setTimeout(function() {
console.log('setTimeout 20ms.');
}, 20);
fn();
请问这个例子中
fn.toString = function() {
return 30;
}
fn.toString在执行上下文创建的时候会被创建吗?还是说function变量 fn创建了.toString这个function变量也被创建了?另外setTimeout这个函数也会被创建吗?这个函数创建后保存这个函数的引用的变量名称是什么呢?
function foo(){
for(var i = 0 ; i<2 ; i++){
setTimeout(function timer() {
console.log(i) ;
},i*1000);
}
}
这个代码中,最后打印2 2,这个我能理解,我想问一下这里的 i*1000,我的理解是1*1000,2*1000.也就是说第一个2是间隔一秒钟之后打印的,第二个2是间隔二秒之后打印的。但是我看浏览器打印的间隔时间是一样的,这是怎么回事?请指教。谢谢
然后,出现时间间隔一样的原因是前一个的1s也包含在后一个的时间里。
function fn() {}
fn.toString = function() {
return 30;
}
console.log(fn);
前面的fn为函数体, 后面的fn为30
这里不太理解
函数的toString属性和valueOf属性有什么关系
同时重写fn. toString和fn. valueOf, 他们都会被调用, toString先调用valueOf后调用, 结果为valueOf的值.只重写toString, 这个函数会被调用两次. 只重写valueOf只会被调用一次.
它们是fn. toString=fn. valueOf=function(){return 30}这样吗,指向同一个函数toString先调用valueOf后调用.
fn直接回车输出内容的过程是什么
setTimeout(function() {
console.log(i);
}, 1000)
}
for(var i = 0; i < 5; i++) {
fn(i);
}
突然想到也可以这么解决,简单粗暴
var object = {
name : "My Object",
getNameFunc : function(){
alert(this.name);
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
for(var i=0;i<5;i++){
setTimeout("console.log("+i+")",i*1000);
}
1.利用setTimeout第三个参数
for (var i=1; i<=5; i++) {
setTimeout( function timer(i) {
console.log(i);
}, i*1000,i );
}
2.利用bind方法
for (var i=1; i<=5; i++) {
setTimeout( function timer(i) {
console.log(i);
}.bind(null,i), i*1000 );
}
3.利用let
for (let i=1; i<=5; i++) {
setTimeout( function timer() {
console.log(i);
}, i*1000 );
}
setTimeout(console.log.bind(console,i), 1000 * i)
}
(function(b){
return setTimeout( function timer() {
console.log(b);
}, b*1000 )
})(i)
}