sisterAn / JavaScript-Algorithms

基础理论+JS框架应用+实践,从0到1构建整个前端算法体系

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

字节:修改以下 print 函数,使之输出 0 到 99,或者 99 到 0

sisterAn opened this issue · comments

要求:

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

function print(n) {
setTimeout(
Promise.resolve(n).then((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), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
  print(i);
}

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

// 取个巧 直接注释掉setTimeout,让他不再无序输出 。这里真正在执行print()时传进去的就是当前的i值
function print(n){
 // setTimeout((() => {
    console.log(n);
    console.log(99-n)
  //})(), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
  print(i);
}
commented
// 方法1, 利用setTimeout、setInterval的第三个参数,第三个以后的参数是作为第一个func()的参数传进去。
function print(n){
  setTimeout(() => {
    console.log(n);
  }, 1, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
  print(i);
}
// 方法2:修改settimout第一个函数参数
function print(n){
  setTimeout((() => {
    console.log(n);
     return () => {}
  }).call(n), Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
  print(i);
}
commented
//async await
function print(n){
  setTimeout(async () => {
    await console.log(n);
  }), Math.floor(Math.random() * 1000);
}
for(var i = 0; i < 100; i++){
  print(i);
}
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(() => {
    console.log(n)
  }, 0*Math.floor(Math.random() * 1000))
}

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

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

总结了一下,解法主要有三种:

方法一:

利用 setTimeoutsetInterval 的第三个参数,第三个以后的参数是作为第一个 func() 的参数传进去

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

方法二:

修改 setTimeout 第一个函数参数

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){
  setTimeout(async () => {
    await console.log(n);
  }), Math.floor(Math.random() * 1000);
}
for(var i = 0; i < 100; i++){
  print(i);
}
commented

方法三错的,1000后面少了个括号

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

这。。写啥 async await哦。。

function print(n){
  setTimeout(() => {
     console.log(n);
  }), Math.floor(Math.random() * 1000); // 这不是一样?实际是把 Math.floor(Math.random() * 1000); 用 ),  分离了
}
for(var i = 0; i < 100; i++){
  print(i);
}
//多加一个参数不就可以了吗
function print(n){
  setTimeout(() => {
    console.log(n);
  },1000, Math.floor(Math.random() * 1000));
}
for(var i = 0; i < 100; i++){
  print(i);
} ```

方法一为什么多加一个参数就可以了

/**
 * setTimeout传参数
 */
setTimeout((a,b,c)=>{
    console.log(a,b,c)
},500,'My','name','is xll')
//解法一 
function print1(n) {
    setTimeout( () => {
        console.log(n)
    }, 1,Math.floor(Math.random() * 1000))
}
for (var i = 0; i < 100; i++) {
    print1(i)
}
//解法二  异步函数
function print2(n) {
    setTimeout(async ()=>{
        await console.log(n)
    }),Math.floor(Math.random()*1000)
}
for(var i=0;i<100;i++) {
    print2(i);
}
commented

异步函数 那个就是骗人, 不用 async 输出也是对的, 想到与 setTimeout(fn, 0), 宏任务也是按照顺序输出

其实方法就两种

  1. 破坏 setTimeout 的时间参数, 时期不是随机或者不生效
  2. 还是记录变量 改变 n 的引用, 不在全局变量可以挂在 print 上 print.n++, 或者挂在外部数据 api store 之类的
function print(n){
  setTimeout(() => {
     console.log(n);
  }), Math.floor(Math.random() * 1000);
}