0

我正在阅读这篇文章 - 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(scope, arguments);中返回 那里?它在做什么,正在返回什么?我删除了那个返回,它仍然有效。

4

3 回答 3

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"));

现在你会明白为什么需要退货

于 2013-01-18T07:40:57.940 回答
1

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

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

于 2013-01-18T07:42:41.217 回答
0

在返回中,您只需返回新函数。在返回的匿名函数的范围内关闭scopeand _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

于 2013-01-18T07:52:09.197 回答