立即执行函数的this指向是window(非严格模式下)

发布时间 2023-11-09 09:43:43作者: 龙陌

请问以下JS代码最后输出的len值是多少?

var len = 117;
let func = {
  len: 935,
  showLen: function() {
    console.log(this.len);
  },
  show: function() {
    (function(cb) {
      cb();
    })(this.showLen)
  }
}
func.show();

正确答案 117

立即执行函数的this指向是window(非严格模式下),
因为作为一个匿名函数,在被调用的时候,我们往往就是直接调用,因此它的this是非常确定的,那么len就取window下的len值了即117。

// 在JavaScript的函数中,this始终指向调用者的上下文环境
var len = 117 // 5. 全局作用域中使用 var 定义的变量默认会成为 window 的属性,及 window.len
let func = {
  len: 935,
  showLen: function () {
    console.log(this.len) // 4. this 此时指向的是 window,所以相当于打印 window.len
  },
  show: function () {
    (function (cb) {
      cb() // 3. cb 相当于 cb.call() 默认没有传入上下文环境时 this 指向全局的 window 对象
    })(this.showLen) // 2. this 是 func 所以传入的是上面定义的 showLen 函数
  }
}

func.show() // 1. 相当于 func.show.call(func),此时 this 是 func

var len=117;我们可以发现这个是用var声明的,属于全局变量,所以打印的结果为117;
若将var改为let,则打印的结果为undefined
因为let声明的全局变量不会挂载到window下面,但var会

函数只要不是new出来的,内部this指向都是window,其他的this指当前块

在非严格模式下,独立函数调用内部this都执行window, 函数直接调用,即没有打点调用或者作为构造函数调用,this指向window,和是不是立即执行函数没有关系。不信执行下面的代码。

var len = 117;
let func = {
 len: 935,
 showLen: function() {
   console.log(this.len);
 },
 show: function() {
   const f = function(cb) {
     cb();
   }
   f(this.showLen)
 }
}
func.show();

结果也是117