面试题答案
一键面试非严格模式下
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
函数内部开启了严格模式,其返回的内部函数在严格模式下,独立调用时this
是undefined
。因为严格模式下,独立函数调用时this
不会自动指向全局对象。当使用func2Call.call(obj)
调用时,显式地将this
绑定到了obj
,所以此时this.value
能正确获取到obj.value
,即42
。
严格模式对this
绑定规则的改变
- 禁止默认绑定到全局对象:在严格模式下,独立函数调用时
this
不再默认指向全局对象,而是undefined
,这使得代码在使用this
时更加严谨,避免了因意外的全局变量创建和修改带来的问题。 - 显式绑定更加重要:严格模式强调了显式地通过
call
、apply
、bind
等方法来绑定this
,让代码中this
的指向更加可控和可预测。