2

取自http://ejohn.org/apps/learn/#84

function bind(context, name){ 
  return function(){ 
    return context[name].apply(context, arguments); 
  }; 
} 

我真的很想知道这是如何工作的。但是,如果您从最里面的函数 console.log 参数,则此函数有效,它们不存在。那么它们怎么可能用在调用它们的 apply 函数中呢?

换句话说:

function bind(context, name){ 
  console.log(arguments.length === 2, true);
  return function(){ 
    console.log(arguments.length === 0, true);
    return context[name].apply(context, arguments); 
  }; 
} 

您可以 console.log 外部函数中的参数并获取长度属性。但是从最里面的函数开始,arguments.length === 0。

4

1 回答 1

2

现在忘记关闭以简化。

该函数bind返回一个函数,如:

function returnedFunction() {
    return context[name].apply(context, arguments);
}

因此,如果我称returnedFunction(1,2,3);参数为1, 2, 3. 如果我打电话returnedFunction(),就没有论据。

现在我们必须担心哪些会在简化中context,那就是当您查看闭包并看到它们在外部函数中定义时。nameundefined

arguments并且this不是变量,因此它们不能被关闭。它们分别针对每个函数调用进行评估。bind无论您传递给什么参数,都会对它们bind进行评估,然后returnedFunction每次调用时都会对它们进行评估returnedFunction

请注意,从返回的函数bind彼此没有关系。他们每个人都有自己独特的环境,具有不同的context绑定name

于 2013-03-22T15:36:53.487 回答