javascript自定义范围绑定功能

时间:2013-01-18 07:27:33

标签: javascript scope bind

我正在阅读这篇文章 - http://www.robertsosinski.com/2009/04/28/binding-scope-in-javascript/ - 其中有自定义绑定函数。

Function.prototype.bind = function(scope) {
  var _function = this;

  return function() {
    return _function.apply(scope, arguments);
  }
}

alice = {
  name: "alice"
}

eve = {
  talk: function(greeting) {
    console.log(greeting + ", my name is " + this.name);
  }.bind(alice) // <- bound to "alice"
}

eve.talk("hello");
// hello, my name is alice

我的问题是这一行特别是

 return function() {
    return _function.apply(scope, arguments);
  }

为什么_function.apply中的返回(范围,参数);那里?它在做什么以及返回什么? 我删除了该返回,它仍然有效。

3 个答案:

答案 0 :(得分:1)

Why is the return in _function.apply(scope, arguments); there? And what is it doing and what is being returned? I removed that return and it still works. 

如果您想要返回值,则会出现这种情况。目前你的谈话功能没有返回任何值,所以你不需要它。如果你将谈话功能改为

eve = {
  talk: function(greeting) {
    return ( greeting + ", my name is " + this.name) ;
  }.bind(alice) // <- bound to "alice"
}

console.log(eve.talk("hello"));

现在您将意识到为什么需要返回

答案 1 :(得分:1)

返回应用原始函数(被绑定的函数)的结果。当您_function.apply时,_function将以scope作为上下文进行调用,因此函数this内部将始终引用scope

第二个参数arguments用于将所有参数传递给原始函数。并且return语句用于确保从原始函数调用返回的值也将从绑定函数调用返回。

答案 2 :(得分:1)

在回报中,您只需返回新功能。您关闭返回的匿名函数范围内的scope_function。它被称为闭包 - 在父函数中可见的所有变量(返回匿名函数的变量)在返回的函数中是可见的。

以下是您的示例:

Function.prototype.bind = function(scope) {
  var _function = this;

  return function() {
    return _function.apply(scope, arguments);
  }
};

function foo() {
    console.log(this.foobar);
}

var bar = {
   foobar: 'baz'
};

foo = foo.bind(bar);

现在一步一步:foo.bind(bar);返回函数:

  function() {
    return _function.apply(scope, arguments);
  }

_functionfooscopebind参数 - bararguments类似于一个数组(不完全),它包含函数的所有参数,因此:foo()this将作为apply的第一个参数提供的作用域}。如果您使用foo(1,2,3)参数将包含1,2,3

记录的结果为baz