对于下面的代码片段
案例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
--当函数作为对象的方法被调用时,它被设置为方法称为on.call 2
的对象--不管是什么,arrowMethod--它被设置为创建它时的值(在上面的示例中,是全局object).call 3
)--如果在输入执行上下文时没有设置该方法的值,则不管是什么,arrowMethod的值都设置为创建时的值(在上面的示例中),()
在非严格的模式下,
call 1
--当一个函数作为对象的方法被调用时,它被设置为这个方法称为on.call 2
的对象--不管是什么,arrowMethod--它被设置为创建它时的值(在上面的示例中,是全局object).call 3
)--因为代码不是处于严格模式,而且由于调用没有设置这个方法的值,这将默认为全局对象,它是browser.call 4
中的一个窗口--不管发生什么,arrowMethod--这被设置为创建时的样子(在上面的示例中,是全局对象)。问题
Case 1: Strict mode
中的call 4
,因为在创建箭头fn时没有设置它的值,所以它始终没有定义?或
发布于 2020-05-12 18:27:03
是的,严格模式函数不默认从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();
https://stackoverflow.com/questions/61759089
复制相似问题