对于下面的代码片段
情况1:严格模式
"use strict"
let obj = {
method: function(){
console.log(this);
},
arrowMethod: () => {
console.log(this);
}
};
obj.method(); // call 1
obj.arrowMethod(); // call 2
let method = obj.method;
let arrowMethod = obj.arrowMethod;
method(); // call 3
arrowMethod(); // call 4
输出为:
{method: ƒ, arrowMethod: ƒ}
Window {parent: Window, opener: null, top: Window, length: 1, frames: Window, …}
undefined
Window {parent: Window, opener: null, top: Window, length: 1, frames: Window, …}
情况2:非严格模式
将输出相同的代码片段
{method: ƒ, arrowMethod: ƒ}
Window {parent: Window, opener: null, top: Window, length: 1, frames: Window, …}
Window {parent: Window, opener: null, top: Window, length: 1, frames: Window, …}
Window {parent: Window, opener: null, top: Window, length: 1, frames: Window, …}
我的理解是:
在严格模式下,
call 1
- 当函数作为对象的方法被调用时,this 将设置为调用该方法的对象。call 2
- 无论如何,arrowMethod 的 this 都会设置为创建时的值(在上面的示例中为全局对象)。call 3
- 如果在进入执行上下文时未设置此值,则它保持未定义状态。call 4
不管怎样,arrowMethod 的 this 都会被设置为它被创建时的值(在上面的例子中,全局对象)。
在非严格模式下,
call 1
- 当函数作为对象的方法被调用时,this 将设置为调用该方法的对象。call 2
- 无论如何,arrowMethod 的 this 都会设置为创建时的值(在上面的示例中为全局对象)。call 3
- 由于代码不是严格模式,并且 this 的值不是由调用设置的,因此 this 将默认为全局对象,即浏览器中的一个窗口.call 4
- 无论如何,arrowMethod 的 this 都会设置为创建时的值(在上面的示例中为全局对象)。
问题
与
情况 1:严格模式
中的call 4
不同,因为创建箭头 fn 时未设置此值,所以它始终保持未定义状态?or
严格模式是否不适用于箭头 fns,因此在创建箭头 fn 时,将其设置为窗口对象?
最佳答案
是的,严格模式函数不默认从 undefined
到全局对象的规则不适用于箭头函数,因为它们没有自己的 this
根本不。它始终是外部作用域中的 this
值。这就是您示例中的window
。
可能重要的是它们定义的函数是否使用严格模式,因为箭头函数从中获取其值:
function strictMake() {
"use strict";
return () => { console.log(this == window); };
}
function sloppyMake() {
return () => { console.log(this == window); };
}
const arrowFromStrict = strictMake();
const arrowFromSloppy = sloppyMake();
arrowFromStrict();
arrowFromSloppy();
关于javascript - 如何使用 `this` 和 "strict"模式确定常规箭头 fn 内正确的 "non-strict"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61759089/