MST

星途 面试题库

面试题:JavaScript严格模式对函数调用中this绑定的影响

考虑以下代码,在非严格模式和严格模式下,`func1`和`func2`函数内部的`this`分别指向什么?分析原因并说明严格模式如何改变了`this`的绑定规则。 var obj = { value: 42, func1: function() { return function() { return this.value; }; }, func2: function() { 'use strict'; return function() { return this.value; }; } }; var func1Call = obj.func1(); var func2Call = obj.func2(); console.log(func1Call.call(obj)); console.log(func2Call.call(obj));
22.0万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

非严格模式下

  • func1函数内部的this指向func1返回了一个内部函数,当func1被调用时,this指向obj,但是返回的内部函数在非严格模式下,其this指向全局对象(在浏览器环境中是window)。原因是这个内部函数是独立调用的,没有明确的调用者,在非严格模式下this默认指向全局对象。当使用func1Call.call(obj)调用时,显式地将this绑定到了obj,所以此时this.value能正确获取到obj.value,即42
  • func2函数内部的this指向:与func1类似,func2返回的内部函数在独立调用时,在非严格模式下this指向全局对象。但是当使用func2Call.call(obj)调用时,显式地将this绑定到了obj,所以此时this.value也能正确获取到obj.value,即42

严格模式下

  • func2函数内部的this指向func2函数内部开启了严格模式,其返回的内部函数在严格模式下,独立调用时thisundefined。因为严格模式下,独立函数调用时this不会自动指向全局对象。当使用func2Call.call(obj)调用时,显式地将this绑定到了obj,所以此时this.value能正确获取到obj.value,即42

严格模式对this绑定规则的改变

  • 禁止默认绑定到全局对象:在严格模式下,独立函数调用时this不再默认指向全局对象,而是undefined,这使得代码在使用this时更加严谨,避免了因意外的全局变量创建和修改带来的问题。
  • 显式绑定更加重要:严格模式强调了显式地通过callapplybind等方法来绑定this,让代码中this的指向更加可控和可预测。