一道阿里巴巴笔试题,求大神解答 阿里巴巴阅读functionjavascript 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、for (var i = 0; i < 10; i++) { 执行完成后,才执行setTimeout 此时i=10; for (var j = 1; j <= i; j++) { 执行了10*10=100次,每次输出“汪汪”2、var dog = function () { return '汪';};var cat = function () { return '喵';};(function () { if (cat() === '喵喵') { dog = function () { return '汪汪'; } } function cat() { return '喵喵'; }})();var count=0,i=0,j=0;function callDog(){if ( i < 10 ) { j++; if(j > i){j=1;i++} count++; console.log(count +"--"+dog()); setTimeout(callDog,1000); }}callDog(); for (var i = 0; i < 10; i++) { (function(i){ setTimeout(function () { for (var j = 1; j <= i; j++) { console.log('第 '+i+' 次输出 '+dog()+i+' 次'); } },1000 * i) })(i); } 1. 异步,执行setTimeout时i=10,相当于执行了10*10次循环2. 不要for循环,让i在setTimeout自调用当中递增 十分感谢,不过能给我讲一讲其中的道理么?实际上就是考你对闭包的了解。for循环执行完成之后,i的值就是其最后一次执行的值+1,虽然定义的是在for中,但是依然在全局中能够使用,所以你后边使用i的值时,都是最后一次执行for的值+1即是:10 十分感谢,不过能给我讲一讲其中的道理么?实际上就是考你对闭包的了解。for循环执行完成之后,i的值就是其最后一次执行的值+1,虽然定义的是在for中,但是依然在全局中能够使用,所以你后边使用i的值时,都是最后一次执行for的值+1即是:10大神你好,能留个QQ么?有技术问题的话我想和你交流。 for (var i = 0; i < 10; i++) { setTimeout(function () { for (var j = 1; j <= i; j++) { console.log(dog()); } }, 1000 * i);}执行顺序,先执行外层的for循环10次,然后i=9settimeout有延迟,所以里面的 j<=i 这里的i在第一次执行的时候就是9里面的for循环也是执行了10次嵌套下来就执行了100次。for (var i = 0; i < 10; i++) { (function(i){ setTimeout(function () { for (var j = 1; j <= i; j++) { console.log('第 '+i+' 次输出 '+dog()+i+' 次'); } },1000 * i) })(i); }这种形式i没有被释放,传入里面for循环的时候,就是 0,1,2,3,4,5,6,7,8,9延迟分别为1000 2000 3000....9000所以延迟0秒执行一次,1秒执行一次9秒执行一次~ var sum = 0;for(var i=0; i<10; i++){ setTimeout(function(i) { console.log(i); for(var j=1; j<=i; j++) { sum++; console.log("第"+sum+"次"+dog()); } }(i), 1000*i);}这样也是可以的。 js onkeyup bug 如何做三级导航 要求内详 Ajax获取服务器数据问题 js封装组件,给点思路吧 关于框架引用的一个问题 封装【定时跳转 + onfucs + onblur 】功能,遇到的问题 Asp.net 单击button后,改变此button的背景色,如何用Jquery实现? 网页中,已知子窗口句柄,怎样用js在父窗口中调用子窗口的函数 EXT换皮肤问题 jquery改变行颜色.... 一个关于JS执行顺序的问题 关于如何自己匹配分辨率定位的js
此时i=10; for (var j = 1; j <= i; j++) { 执行了10*10=100次,每次输出“汪汪”
2、var dog = function () {
return '汪';
};
var cat = function () {
return '喵';
};(function () {
if (cat() === '喵喵') {
dog = function () {
return '汪汪';
}
} function cat() {
return '喵喵';
}
})();
var count=0,i=0,j=0;
function callDog(){
if ( i < 10 ) {
j++;
if(j > i){j=1;i++}
count++;
console.log(count +"--"+dog());
setTimeout(callDog,1000);
}
}
callDog();
for (var i = 0; i < 10; i++) {
(function(i){
setTimeout(function () {
for (var j = 1; j <= i; j++) {
console.log('第 '+i+' 次输出 '+dog()+i+' 次');
}
},1000 * i)
})(i);
}
2. 不要for循环,让i在setTimeout自调用当中递增
实际上就是考你对闭包的了解。
for循环执行完成之后,i的值就是其最后一次执行的值+1,虽然定义的是在for中,但是依然在全局中能够使用,所以你后边使用i的值时,都是最后一次执行for的值+1即是:10
实际上就是考你对闭包的了解。
for循环执行完成之后,i的值就是其最后一次执行的值+1,虽然定义的是在for中,但是依然在全局中能够使用,所以你后边使用i的值时,都是最后一次执行for的值+1即是:10
大神你好,能留个QQ么?有技术问题的话我想和你交流。
setTimeout(function () {
for (var j = 1; j <= i; j++) {
console.log(dog());
}
},
1000 * i);
}
执行顺序,先执行外层的for循环10次,然后i=9
settimeout有延迟,所以里面的 j<=i 这里的i在第一次执行的时候就是9
里面的for循环也是执行了10次
嵌套下来就执行了100次。
for (var i = 0; i < 10; i++) {
(function(i){
setTimeout(function () {
for (var j = 1; j <= i; j++) {
console.log('第 '+i+' 次输出 '+dog()+i+' 次');
}
},1000 * i)
})(i);
}
这种形式i没有被释放,传入里面for循环的时候,就是 0,1,2,3,4,5,6,7,8,9
延迟分别为1000 2000 3000....9000
所以延迟0秒执行一次,1秒执行一次9秒执行一次~
for(var i=0; i<10; i++)
{
setTimeout(function(i)
{
console.log(i);
for(var j=1; j<=i; j++)
{
sum++;
console.log("第"+sum+"次"+dog());
}
}(i), 1000*i);
}
这样也是可以的。