-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第 31 题:改造下面的代码,使之输出0 - 9,写出你能想到的所有解法。 #43
Comments
|
for (var i = 0; i< 10; i++){
setTimeout(((i) => {
console.log(i);
})(i), 1000)
}
for (var i = 0; i< 10; i++){
setTimeout((() => {
console.log(i);
})(), 1000)
}
for (let i = 0; i< 10; i++){
setTimeout(() => {
console.log(i);
}, 1000)
}
|
正常写法: for (var i = 0; i < 10; i++) {
setTimeout(((i) => {
console.log(i);
})(i), 1000)
} 砸场子写法: let i = 0,
timer = setInterval(() => {
i < 10 ?
console.log(i++) :
clearInterval(timer);
}) |
|
解决办法汇总
|
利用try/catch的块级作用域也能实现目的:
|
闭包解法
|
除了 let 这个可能是改动最少的😂 |
for (var i = 0; i< 10; i++){
(() => {
var temp = i // 闭包
setTimeout(() => {
console.log(temp);
}, 1000)
})()
} |
涨知识啦 |
for(let i=0;i<10;i++){ for(var i=0;i<10;i++){ for(var i=0;i<10;i++){ |
for (var i = 0; i< 10; i++){
setTimeout(((i) => {
console.log(i);
}).call(null,i), 1000)
} |
最简单的将var改成let for (let i = 0; i< 10; i++){
setTimeout(() => {
console.log(i);
}, 1000)
} |
其实有些方法是不满足要求的,为啥这样说呢?因为题目其实是有隐性要求,也即每隔 1s 输出一个数字,虽说题目没有明确说出来。所以这种解法不满足要求,比如: for (var i = 0; i < 10; i++) {
setTimeout(console.log(i, Date.now()), 1000)
} |
for (let i = 0; i< 10; i++){ |
for (var i = 0; i < 10; i++) { console.log(i) } |
|
|
for(var i = 0; i < 10; i++){ |
console.log(0),console.log(1),console.log(2),console.log(3),console.log(4),console.log(5),console.log(6),console.log(7),console.log(8),console.log(9) |
for (var i = 0; i< 10; i++){ |
for (let i = 0; i< 10; i++){ 又没说一定要用setTimeOut,这难道不是最简单效率最高的一种解法? |
1、闭包实现 变量保存,settimeout第三个参数转为函数参数也属于闭包。 |
这两种解法,都好牛B |
看到最后没有看到有人写一秒输出一个的情况。 |
方法1:立即执行函数表达式法简称(IIFE)不标准叫法立即执行函数 for (var i = 0; i<10; i++) {
// IIFE: (function (j) {})(i);
(function (j) {
setTimeout(function () {
console.log(j)
}, 1000)
})(i)
} 方法2:将var 改为 let for (let i = 0; i<10; i++) {
setTimeout(function () {
console.log(i)
}, 1000)
} 方法3:使用promise函数 for (var i = 0; i<10; i++) {
new Promise(function (resolve, reject) {
resolve(i)
}).then(function (data) {
setTimeout(() => {
console.log(data)
}, 1000)
})
} 方法4:使用bind绑定(参考楼上的,加深印象) for(var i = 0; i<10; i++) {
setTimeout(console.log.bind(null, i), 1000)
} 方法5: 使用try catch构成块级作用域(参考楼上的,加深印象) for (var i = 0; i<10; i++) {
try{
throw(i)
}catch (i) {
setTimeout(function () {
console.log(i)
},1000)
}
} 另附promise相关的题目 |
|
大智若愚 |
方式一for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i);
}, 1000 * i);
} 方式二for (var i = 0; i < 10; i++) {
(function (j) {
setTimeout(() => {
console.log(j);
}, 1000 * j);
})(i);
} 方式三for (let i = 0; i < 10; i++) {
setTimeout((i) => {
console.log(i);
}, 1000 * i, i);
} 方式四let i = 0;
const timer = setInterval(() => {
console.log(i);
i++;
if (i > 9) {
clearInterval(timer);
}
}, 1000); |
感觉就是两种方法:
|
|
// let 块级作用域
for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i);
}, 1000)
}
// 闭包
for (var i = 0; i < 10; i++) {
((j) => {
setTimeout(() => {
console.log(j);
}, 1000)
})(i)
}
// promise 异步,其实也可以用generator将i保存在堆中
for (var i = 0; i < 10; i++) {
new Promise((resolved, rejected) => {
resolved(i);
}).then((j) => {
setTimeout(() => {
console.log(j);
}, 1000)
})
}
// try catch
for (var i = 0; i < 10; i++) {
try {
throw (i);
} catch (i) {
setTimeout(() => {
console.log(i);
}, 1000)
}
} |
//来一个没提到的
function go(i){
setTimeout(()=>{
console.log(i)
}, 1000*i)
}
for(var i = 0; i < 10; i++){
go(i);
} |
console.log(...[0,1,2,3,4,5,6,7,8,9]) |
// 方法1 for (var i = 0; i< 10; i++){
(function fn(i){
setTimeout(() => {
console.log(i);
}, 1000)
})(i)
} // 方法2
// 方法3 for (let i = 0; i< 10; i++){
setTimeout(() => {
console.log(i);
}, 1000)
} |
are you dou 我? |
for (var i = 0; i< 10; i++){
setTimeout(console.log, 1000, i)
} 这是最简单的! |
// 1. 通过立即执行函数,保存每一次遍历的i
// 相当于生成了 10个立即执行函数
for (var i = 0; i < 10; i++) {
(function (i) {
setTimeout(() => {
console.log(i);
}, 0);
})(i);
}
// 2. 使用let 生成 块级作用域
for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i);
}, 0);
} |
// 创建函数 通过函数的入参生成新的变量-----
为啥没人写这个 而且 闭包能 解决这道题的原因该是因为函数的入参 生成的变量保留了i 而不是闭包的问题 |
|
我用 es6 实现一下 function sleep (time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
async function fn() {
for (var i = 0; i < 10; i++){
await sleep(1000);
console.log(i);
}
}
fn(); |
|
for (var i = 0; i < 5; i++) { |
|
// 1、let
for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i)
}, 1000)
}
// 2、setTimeout 的第三个参数
for (var i = 0; i < 10; i++) {
setTimeout(
(a) => {
console.log(a)
},
1000,
i
)
}
// 3、IIFE
for (var i = 0; i < 10; i++) {
;(function (a) {
setTimeout(() => {
console.log(a)
}, 1000)
})(i)
}
// 4、try catch 块级作用域
for (var i = 0; i < 10; i++) {
try {
throw i
} catch (e) {
setTimeout(() => {
console.log(e)
}, 1000)
}
}
// 5、bind
for (var i = 0; i < 10; i++) {
setTimeout(((i) => {
console.log(i)
}).bind(null, i), 1000)
} |
for (var i = 0; i < 10; i++) {
(function(j){//闭包
setTimeout(function(){
console.log(j);//分别输出i的值
},1000*j) //设置明显的时间差
})(i);//闭包
}; 理解到考点,背解意义不大。 |
|
兄弟们,给你们来个邪门歪道 |
优秀,第三个参数可否解释下 |
//方法一
for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i)
}, 1000)
}
//方法二
for (var i = 0; i < 10; i++) {
(function(j) {
setTimeout(() => {
console.log(j)
}, 1000)
})(i)
}
//方法三
for (var i = 0; i < 10; i++) {
foo(i)
}
function foo(i) {
setTimeout(() => {
console.log(i)
}, 1000)
}
//方法四
for (var i = 0; i < 10; i++) {
setTimeout((j) => {
console.log(j)
}, 1000, i)
}
//方法五
for (var i = 0; i < 10; i++) {
new Promise(function(resolve, reject) {
resolve(i)
}).then(function(i) {
setTimeout(() => {
console.log(i)
}, 1000)
})
} |
都不运行一下的吗 |
牛逼 |
在原始代码中,由于 setTimeout 回调函数是在循环结束后才执行,所以无论循环多快,输出的结果都会是 10 个 10。为了实现按顺序输出 0 - 9,可以尝试以下几种解法: 解法一:使用 let 关键字声明循环变量 解法二:使用闭包保存变量 解法三:使用 setTimeout 的第三个参数传递当前循环的索引 解法四:使用 async/await 和 Promise async function printNumbers() { printNumbers(); |
解法一
解法二
解法三
|
The text was updated successfully, but these errors were encountered: