所以,我有3个功能,如下所示:
function a() {
arguments[0]();
}
function b(fn) {
fn();
}
function c() {
console.log(this);
}
现在,考虑输出:
a(c) // Arguments
b(c) // Window
a(() => {console.log(this}) // Window
b(() => {console.log(this)}) // Window
在所有其他情况下,为什么a(c)
处于窗口状态(考虑非严格)时会输出参数?
答案 0 :(得分:3)
在JavaScript this
中通常指的是从中调用该函数的对象(除非它是箭头函数)。例如,如果我们做这样的事情:
var obj = { fun: function() { console.log(this); } }
var obj1 = { fun: obj.fun, otherProperty: 123 }
obj.fun(); // equivalent to obj["fun"]()
obj1.fun(); // equivalent to obj1["fun"]()
我们会发现,在第一个调用中,this
引用了obj
,在第二个调用中,引用了obj1
,即使它具有相同的功能。
现在,arguments
变量是一个对象,它存储所有传递给函数的参数。如果参数是一个函数,并且您通过arguments
对象进行访问,则它将成为从其调用该函数的“父”对象,并且它将成为函数执行上下文中的新this
。您可以认为您的情况等于这样:
function c() {
console.log(this);
}
var arguments = { "0" : c }
arguments["0"]() // will log the arguments object
在第二次调用(b(c)
)中,作为参数传递的函数直接在父函数内部调用,而无需通过代理对象进行访问-在这种情况下,this
将从父函数复制执行范围,即window
。
在第三个和第四个示例中,两个函数都是使用箭头函数定义的,该函数从创建它们的上下文中保存this
的值,并且防止该值被更改。
有关箭头功能的更多信息:Arrow functions