了解涉及“参数”的“这种”行为

时间:2018-10-31 07:47:30

标签: javascript arguments this

所以,我有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)处于窗口状态(考虑非严格)时会输出参数?

1 个答案:

答案 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