-
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
第 101 题:修改以下 print 函数,使之输出 0 到 99,或者 99 到 0 #158
Comments
function print(n){
setTimeout((() => {
console.log(n)
return ()=>{}
}).call(n,[]), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} |
|
|
function print(n){ |
第一种解法: function print(n) {
setTimeout( (() => {
console.log(n);
})(), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} 另一种解法则是根据setTimeout的时间戳,只要让它按照时间戳顺序打印即可。但这样的时间耗时相当长。 function print(n){
setTimeout(() => {
setTimeout( () =>{
console.log(n);
}, 1000 * n);
}, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} |
楼上匿名函数自执行是一种解法,直接利用表达式也是一种解法!
99到0,就是 99 - n
|
综合上面各位大佬的答案,使用立即执行函数如果没有return值的话相当于 setTimeout(undefined, Math.floor(Math.random() * 1000)); 浏览器会报错,所以还是需要加入返回值的 setTimeout( (() => {
console.log(n);
return ()=>{};
})(), Math.floor(Math.random() * 1000)); |
function print(n){
setTimeout(() => {
setTimeout(()=>{
console.log(n);
},1000*n)
}, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
}
function print(n){
setTimeout(() => {
setTimeout(()=>{
console.log(99-n);
},1000*n)
}, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} |
|
综合上面大佬给出的答案,感觉这题就是打乱了输出顺序,根本解决办法无外乎就是让定时器里的函数在同一任务队列里去执行,立即执行函数可以实现,或者给任意只要相同的时间间隔也可以实现。 |
1、闭包,匿名函数自执行 ,即使创建它的上下文已经销毁,变量仍然存在, |
两种解法:
|
没有报错啊 |
忽略Math.floor(Math.random() * 1000) 影响(不过打印的太慢了吧(#`O′)) function print(n){ |
只是判断是不是function类型 |
function print(n){ |
// 方法1 利用for的变量i 输出99-0
function print(n){
setTimeout(() => {
console.log(--i);
}, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
}
//方法2 将setTimeout 的时间改为 0*Math.floor(Math.random() * 1000) .. 取巧了一下
// 输出0-99
function print(n){
setTimeout(() => {
console.log(n);
}, 0*Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} |
|
function print(n){ |
把Math.random挤掉就好了。 |
0 -99
function print(n){
setTimeout((function () {
console.log(n)
return function () {}
})(), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
}
99 - 0
function print(n){
setTimeout((function () {
console.log(Math.abs(n - 99))
return function () {}
})(), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} |
emm,楼主不给答案讲解得嘛 |
我理解的讲一下,2种方法 |
function print(n){
setTimeout((() => {
// console.log(this.i); // 如果不借助call会打印出100次全局变量i,值都为100
console.log(n); // 顺序打印出0~99(100个)
console.log(99-n); // 倒序打印出99~0(100个)
}).call(null, n), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++) {
// console.log(i) // 0~99
print(i);
}
console.log(i) // 注意:此时i在全局window里可访问到,值为100 |
function print(n) { for(var i=0;i<100;i++){ |
利用异步函数也可以,这个简单直接 |
请问第二个方法不是异步的吗,最后为什么不是都打印99呢? |
function print(n) { |
这是当做参数传到print方法的,正真执行print方法的时候i参数就是当时的i的值 |
function print(n){ |
思路很清晰,把setTimeout的第二个参数改为n function print(n){
setTimeout(() => {
console.log(n);
},n, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} |
function print(n){ |
@Chenxinan 你这个只要把 |
@Hunterang 恩恩,感觉这题是想考核面试者在不用promise.all()的情况下,在并发100次请求后,如何把浏览器在不同时间点获取到的数据按原先的数据逻辑顺序输出。 |
function print(n){ |
// 0~99
function print(n){
setTimeout(() => {
setTimeout(()=>{
console.log(n);
},n*1000)
}, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} // 99-0
function print(n){
setTimeout(() => {
setTimeout(()=>{
console.log(n);
},(100-n)*1000)
}, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} 第二种,去掉setTimeout function print(n){
((() => {
console.log(n);
})(), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} |
function print(n){
setTimeout(()=>{
console.log(n);
},(n*1000)+Math.floor(Math.random()*1000))
}
for(var i=0;i<100;i++){
print(i)
} |
理是?没看懂 |
我去脑筋急转弯的题 |
function print(n) {
setTimeout((i => {
console.log(i);
})(i),Math.floor(Math.random() * 1000)
);
}
for (var i = 0; i < 100; i++) {
print(i);
} |
看了各位的解法我觉得自己的解法跟闹着玩似的…… 在每一次执行前重写了 Math.random………… function print(n){
setTimeout((function(){
Math.random = function(){
return 0.1 * n;
}
return (() => {
console.log(n);
})})(), Math.floor(Math.random() * 1000));
} |
// 方法一
function print(n) {
setTimeout(() => {
// console.log(n);
let i = n
setTimeout(() => {
console.log(i, 'ddd')
}, n * 1000)
},
Math.floor(Math.random() * 1000)
);
}
for (var i = 0; i < 100; i++) {
print(i);
}
// 方法二
function print(n) {
setTimeout(() => {
// console.log(n);
setTimeout((i) => {
console.log(i)
}, n * 1000, n)
},
Math.floor(Math.random() * 1000)
);
}
for (var i = 0; i < 100; i++) {
print(i);
}
// 方法三 立即执行函数,相当于同步代码
function print(n){
setTimeout((()=>{
console.log(n)
return ()=>{}
})(), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} |
换一种思路 function print(n){
setTimeout(() => {
if (!print.cache) {
print.cache = [];
print.id = null;
};
print.cache.push(n);
clearTimeout(print.id);
print.id = setTimeout(() => {
print.cache.sort((a, b) => a - b);
for (let num of print.cache) {
console.log(num);
}
delete print.id;
delete print.cache;
// 最长不过1000ms
}, 1000);
}, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} |
感觉无论是立即执行函数、表达式,还是用n去替代Math.random,脱离了题目本身的意义。所以考的是脑筋急转弯? |
function print(n){ |
支持原题中间隔随机时间 (() => {
function print(n) {
setTimeout(
(() => {
// const prev = i.__proto__.prev;
const prev = print.prev;
let resolver = () => {};
// i.__proto__.prev = new Promise(resolve => {
print.prev = new Promise(resolve => {
resolver = resolve;
});
const exec = (delay) => {
setTimeout(() => {
console.log(n);
resolver();
}, delay);
};
return prev
? (delay) => {
prev
.then(exec.bind(null, delay))
.then(() => {
// if (i.__proto__.prev) {
if (print.prev) {
// delete i.__proto__.prev;
delete print.prev;
}
});
}
: exec;
})(),
0,
Math.floor(Math.random() * 1000)
);
}
for (var i = 0; i < 100; i++){
print(i);
}
})() |
不知道这燕子算不算满足要求 function print(n) {
setTimeout(() => {
if (!print.index && print.index !== 0) {
print.index = 99
} else {
print.index--
}
console.log(print.index)
}, Math.floor(Math.random() * 1000))
}
for (var i = 0; i < 100; i++) {
print(i)
} |
还可以利用逗号表达式 :-) 但我实在搞不懂这题的目的是啥? function print(n){
setTimeout((console.log(n), () => null), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} |
function print(n) {
setTimeout(() => {
if (!print.list) print.list = []
if (!print.timer)
print.timer = setTimeout(() => {
print.list.forEach(fn => fn())
}, 1000)
print.list[n] = () => console.log(n)
}, Math.floor(Math.random() * 1000))
}
for (var i = 0; i < 100; i++) {
print(i)
} |
function print(n) {
setTimeout((function () {
console.log(n);
return () => { }
})(), Math.floor(Math.random() * 1000));
}
for (var i = 0; i < 100; i++) {
print(i);
} |
`function print(n) { for (var i = 0; i < 100; i++) { |
词法环境与闭包的联系:
|
function print(n){ |
0~99function print(n){
setTimeout((() => {
console.log(99);
return () => {}
})(), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} 99~0function print(n){
setTimeout((() => {
console.log(99-n);
return () => {}
})(), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
} |
利用 settimeout 的第一个参数 可以传 表达式 的原理,绕过了 随机的定时器执行 function print(n){
setTimeout((console.log(n),()=>{}),Math.floor(Math.random()*1000));
}
for(var i = 0; i < 100; i++){
print(i);
} |
|
你好,我已经收到你的来信!
|
要求:
1、只能修改
setTimeout
到Math.floor(Math.random() * 1000
的代码2、不能修改
Math.floor(Math.random() * 1000
3、不能使用全局变量
The text was updated successfully, but these errors were encountered: