【问题标题】:How is "This" assigned when calling an anonymous function using "Call"?使用“Call”调用匿名函数时如何分配“This”?
【发布时间】:2012-11-04 08:57:38
【问题描述】:

来自MDN

var animals = [
  {species: 'Lion', name: 'King'},
  {species: 'Whale', name: 'Fail'}
];

for (var i = 0; i < animals.length; i++) {
  (function (i) {
    this.print = function () {
      console.log('#' + i  + ' ' + this.species + ': ' + this.name);
    }
    this.print();
  }).call(animals[i], i);
}

在上面的例子中,“this”是如何在“animals”循环内的匿名函数中使用的?我很好奇为什么“this”引用的是动物对象而不是窗口。

例如,如果我要从参数中删除 animals[i],那么一切都是未定义的。这是否意味着匿名函数从它们接收到的第一个参数中派生出它们的“身份”,还是发生了其他事情?

提前致谢!

【问题讨论】:

    标签: javascript oop call this


    【解决方案1】:

    这不是在你自己引用的documentation of function.call() 中解释过吗?

    fun.call(thisArg[, arg1[, arg2[, ...]]])
    

    参数

    thisArgthis 的值用于调用 fun。 [...]

    及以后:

    说明

    您可以在调用现有函数时分配不同的this 对象。

    所以你是对的,animals[i] 在函数内部用作this。您可以将其视为始终具有 this 名称的隐式隐藏参数。

    【讨论】:

    • 接着说,“将对象作为这个值传递并不是绝对必要的,而是出于解释的目的。”,但如果我删除该参数,一切都是未定义的。这就是我发布问题的原因。
    【解决方案2】:

    就是这个部分:

      }).call(animals[i], i);
    

    通过使用.call() 调用,this 的值被明确指定。

    Function 原型提供了两个类似的功能:.call().apply()。它们都允许以 this 的某些特定值(对对象的引用)调用函数(任何函数,无论是否匿名 - 没有真正的区别)。

    this 的值总是在调用函数时以一种或另一种方式设置。如果对函数的引用由.[ ] 表达式确定:

    something.fn( whatever );
    
    something[ expression ](whatever);
    

    那么this 的值就是基础对象的值(上面例子中的“某物”)。 Eich 先生称其为“接收者”,如果您想到诸如 Smalltalk 消息之类的函数调用,这是有道理的。

    如果您在没有基础对象的情况下调用函数,则 this 的值要么是全局对象,要么是 null(如果您处于“严格”模式)。

    【讨论】:

      【解决方案3】:

      因为您使用的是call,其定义为:

      call(thisScope, args)

      因此,您将animal[i] 作为thisScope 传递的事实意味着this == animal[i]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-30
        • 2012-03-22
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        • 2014-08-16
        • 1970-01-01
        相关资源
        最近更新 更多