Home Diary Blog Photo Community Open Source
Inside setTimeout

参考文档

记住这两段话,它们非常的关键和重要

  • 《JavaScript高级程序设计》第二版中,写到:“超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined。

  • 我们说,setTimeout中有两个this。第一,调用环境下的this,称之为第一个this;第二,把延迟执行函数中的this称之为第二个this;第一个this的指向是需要根据上下文来确定的,默认为window;第二个this就是指向window。

箭头函数有几个使用注意点

  • (1). 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
  • (2). 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
  • (3). 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
  • (4). 不可以使用yield命令,因此箭头函数不能用作 Generator 函数。

闭包自执行

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

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

//结果按顺序输出 

箭头函数

'use strict';
function print(n) {
  setTimeout(()=> {
    console.log(n);
  }, Math.random(n)*1000);
}

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

//结果乱序输出 

箭头函数自执行

'use strict';
function print(n) {
  setTimeout((()=> {
    console.log(n);
  })(), Math.random(n)*1000);
}

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

//结果按顺序输出 

直接语句调用

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

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

//结果按顺序输出 

普通函数调用

'use strict';
function test(n) {
  console.log(n)
}

function print(n) {
  setTimeout(test(n), Math.random(n)*1000);
}

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

//结果按顺序输出 

包装普通函数调用1

'use strict';
function test(n) {
  console.log(n)
}

function print(n) {
  setTimeout(function(){test(n)}, Math.random(n)*1000);
}

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

//结果乱序输出

包装普通函数调用2

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

for(var i=0;i<10;i++) {
  print(i);
}
//结果乱序输出