调用匿名函数的MDN示例

时间:2015-02-07 23:45:44

标签: javascript

我试图理解为什么调用确实有效,我是面向对象的java脚本的新手,这个关键字和函数就像call一样。

我在网上找到了以下一行:

this.tabs = [].slice.call( this.el.querySelectorAll( 'nav > ul > li' );

我尝试了解每个功能并且非常成功,实际上下面的线程帮助了我:

Link

然后理解电话有点困难,特别是在看MDN call doc's之后。

我不太了解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);
}

现在我理解了Object文字,我理解for循环,我理解IIFE,我理解this.print();函数被调用,

我不明白的是以下内容:

call(animals[i], i);

并将参数传递给它。

亲切的问候。

2 个答案:

答案 0 :(得分:1)

(function () { ... }).call(animals[i], i)调用函数(function () { ... })&#34; on&#34;对象animals[i](即:在通话范围内,this将为animals[i]),参数为i

换句话说,它等同于:

animals[i].f = function () { ... };
animals[i].f(i);

除了不必设置animals[i].f

答案 1 :(得分:1)

或许更简单的解释方法是将其折叠一下:

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

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

可能会错误地认为该调用适用于动物[i],但它实际上已应用于已定义的匿名函数。换句话说,正在刚刚创建的匿名函数上调用“call”方法。通过这种方式,该功能可以应用于动物而无需明确定义。