第 101 题:修改以下 print 函数,使之输出 0 到 99,或者 99 到 0

发布于 2022-08-15 17:25:33 字数 388 浏览 208 评论 28

要求:

1、只能修改 setTimeoutMath.floor(Math.random() * 1000 的代码

2、不能修改 Math.floor(Math.random() * 1000

3、不能使用全局变量

function print(n){
  setTimeout(() => {
    console.log(n);
  }, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
  print(i);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(28

猫九 2022-05-04 13:55:35

利用异步函数也可以,这个简单直接

晨光如昨i 2022-05-04 13:55:35
// 方法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);
}

请问第二个方法不是异步的吗,最后为什么不是都打印99呢?

〆凄凉。 2022-05-04 13:55:35

function print(n) {
setTimeout(() => {
console.log(n);
}, n * 1001 + Math.floor(Math.random() * 1000));
}
for (var i = 0; i < 100; i++) {
print(i);
}
不知道这样违规没有

陈独秀 2022-05-04 13:55:34

忽略Math.floor(Math.random() * 1000) 影响(不过打印的太慢了吧(#`O′))

function print(n){
setTimeout(() => {
setTimeout(()=>{
console.log(n);
},(n+1)*1000);
}, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
}

朮生 2022-05-04 13:55:34

综合上面各位大佬的答案,使用立即执行函数如果没有return值的话相当于

setTimeout(undefined, Math.floor(Math.random() * 1000));

浏览器会报错,所以还是需要加入返回值的

 setTimeout( (() => {
        console.log(n);
    	return ()=>{};
  })(), Math.floor(Math.random() * 1000));
window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. >*/) {
var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
return __nativeST__(vCallback instanceof Function ? function () {
vCallback.apply(oThis, aArgs);
} : vCallback, nDelay);
};`

只是判断是不是function类型

遗弃M 2022-05-04 13:55:34

function print(n){
setTimeout( (() => {
console.log(n);
return ()=>{};
})(), Math.floor(Math.random() * 1000));
}
for(var i=0;i<100;i++){
print(i)
}

西瑶 2022-05-04 13:55:34
// 方法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);
}
断舍离 2022-05-04 13:55:34
  1. 0-99
function print(n){
  setTimeout(() => {
    console.log(n);
  }, 1, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
  print(i);
}
  1. 99-0
function print(n){
  setTimeout(() => {
    console.log(99 - n);
  }, 1, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
  print(i);
}
最偏执的依靠 2022-05-04 13:55:34

function print(n){
setTimeout(() => {
console.log((i++)-100);
}, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
}

枯〃寂 2022-05-04 13:55:34
function print(n){
  setTimeout((n) => {
    console.log(n);
  },0,n, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
  print(i);
}

把Math.random挤掉就好了。

へへ乖乖 2022-05-04 13:55:34
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);
}
絕版丫頭 2022-05-04 13:55:34

emm,楼主不给答案讲解得嘛

世态炎凉。 2022-05-04 13:55:34

emm,楼主不给答案讲解得嘛

我理解的讲一下,2种方法
1.立即执行函数
2.定时器第二位重新赋固定的值

神妖 2022-05-04 13:55:34

题目解析:向setTimeout() 传递一个函数时,该函数中的this指向跟你的期望可能不同,当前这些代码中包含的 this 关键字在非严格模式会指向window对象,严格模式下为undefined。此时可以借助call或apply去改变this指向,即可顺序打印出0到99(或倒序99到0)

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
我不吻晚风 2022-05-04 13:55:34

function print(n) {
setTimeout(async ()=>{
await new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve(n)
},n*1000)
});
console.log(n)
},Math.floor(Math.random()*100))
}

for(var i=0;i<100;i++){
print(i)
}

献世佛 2022-05-04 13:55:33

1、闭包,匿名函数自执行 ,即使创建它的上下文已经销毁,变量仍然存在,
2、是随机输出 0 到 99,或者 99 到 0?

清风挽心 2022-05-04 13:55:33

两种解法:

  1. 利用settimeout 接受多个参数的方向,将Math.floor(Math.random() * 1000)作为第三个参数,第二参数可以设置为任意值。
    function print(n){
    setTimeout(() => {
    console.log(n);
    }, 1, Math.floor(Math.random() * 1000));
    }
    for(var i = 0; i < 100; i++){
    print(i);
    }
    2.可以利用settimeout 第一个参数可以是function是立即执行或者一个执行函数。
岁月ツ蹉跎了容颜。 2022-05-04 13:55:33

综合上面各位大佬的答案,使用立即执行函数如果没有return值的话相当于

setTimeout(undefined, Math.floor(Math.random() * 1000));

浏览器会报错,所以还是需要加入返回值的

 setTimeout( (() => {
        console.log(n);
    	return ()=>{};
  })(), Math.floor(Math.random() * 1000));

没有报错啊

旧人 2022-05-04 13:55:32

综合上面大佬给出的答案,感觉这题就是打乱了输出顺序,根本解决办法无外乎就是让定时器里的函数在同一任务队列里去执行,立即执行函数可以实现,或者给任意只要相同的时间间隔也可以实现。

情魔剑神 2022-05-04 13:55:29
function print(n){
  print.n === undefined ? (print.n = 0) : (n !== 0 && print.n + 1 !== n) ? (setTimeout(() => {print(n)}, 1000)) : (setTimeout(() => {
    console.log(n);
    print.n += 1
  }, Math.floor(Math.random() * 1000)))
}
for(var i = 0; i < 100; i++){
  print(i);
}
狂之美人 2022-05-04 13:55:24
  1. 依次打印出 0-99
function print(n){
  setTimeout(() => {
    setTimeout(()=>{
       console.log(n);
    },1000*n)
  }, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
  print(i);
}
  1. 依次打印出99-0
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);
}
相思故 2022-05-04 13:55:13

综合上面各位大佬的答案,使用立即执行函数如果没有return值的话相当于

setTimeout(undefined, Math.floor(Math.random() * 1000));

浏览器会报错,所以还是需要加入返回值的

 setTimeout( (() => {
        console.log(n);
    	return ()=>{};
  })(), Math.floor(Math.random() * 1000));
留一抹残留的笑 2022-05-04 13:53:59

楼上匿名函数自执行是一种解法,直接利用表达式也是一种解法!

function print(n){
  setTimeout(console.log(n), Math.floor(Math.random() * 1000));
}

for(var i = 0; i < 100; i++) {
  print(i);
}

99到0,就是 99 - n

function print(n){
  setTimeout(console.log(99 - n), Math.floor(Math.random() * 1000));
}

for(var i = 0; i < 100; i++) {
  print(i);
}
友谊不毕业 2022-05-04 13:53:35

第一种解法:

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);
}
陌上青苔 2022-05-04 13:48:27

function print(n){
setTimeout((() => {
console.log(n);
}).apply(n), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
print(i);
}

何以心动→ 2022-05-04 13:11:24
function print(n){
  setTimeout(() => {
    console.log(n);
  }, 1, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
  print(i);
}
标点╮ 2022-05-04 13:10:16

function print(n){ setTimeout(() => { console.log(n); }, Math.floor(Math.random()+1) * 1000); } for(var i = 0; i < 100; i++){ print(i); }

醉梦枕江山 2022-04-30 15:21:32
function print(n){
  setTimeout((() => {
    console.log(n)
    return ()=>{}
  }).call(n,[]), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
  print(i);
}
~没有更多了~

关于作者

蛮可爱

暂无简介

0 文章
0 评论
25 人气
更多

推荐作者

马化腾

文章 0 评论 0

thousandcents

文章 0 评论 0

辰『辰』

文章 0 评论 0

ailin001

文章 0 评论 0

冷情妓

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文