我正在阅读这篇文章 - 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中的返回(范围,参数);那里?它在做什么以及返回什么? 我删除了该返回,它仍然有效。
答案 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);
}
_function
是foo
,scope
是bind
参数 - bar
。 arguments
类似于一个数组(不完全),它包含函数的所有参数,因此:foo()
,this
将作为apply
的第一个参数提供的作用域}。如果您使用foo(1,2,3)
参数将包含1,2,3
。
记录的结果为baz
。