对于下面的代码段
"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, …}
将输出相同的代码段
{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
-将函数作为对象的方法调用时,将其设置为调用该方法的对象。call 2
-不管怎样,arrowMethod的设置为创建时的状态(在上面的示例中是全局对象)。 call 3
-如果在进入执行上下文时未设置此值,则其值未定义。call 4
无论如何,arrowMethod的参数设置为创建时的状态(在上面的示例中是全局对象)。 在非严格模式下,
call 1
-将函数作为对象的方法调用时,将其设置为调用该方法的对象。call 2
-不管怎样,arrowMethod的设置为创建时的状态(在上面的示例中是全局对象)。 call 3
-由于代码不是处于严格模式下,并且由于未通过调用设置其值,因此它将默认为全局对象,它是浏览器中的窗口。]call 4
-不管怎样,arrowMethod的设置为创建时的状态(在上面的示例中是全局对象)。 与call 4
中的Case 1: Strict mode
不同,由于在创建箭头fn时未设置其值,因此始终保持未定义状态吗?
或
严格模式是否不适用于箭头fns,因此在创建箭头fn时将其设置为窗口对象?
对于下面的代码片段,情况1:严格模式“ use strict” let obj = {method:function(){console.log(this); },arrowMethod:()=> {console.log(this); }; obj.method(); // ...
是的,严格模式函数的默认规则不是默认从undefined
到全局对象,因此不适用于箭头函数,因为它们根本没有自己的this
。它始终是外部示波器的this
值。在您的示例中就是window
。