2012-03-12 118 views
1

下面是JS绑定的ES5填充。我不明白self .apply在绑定函数中。 我知道如何使用apply方法,但是在这种情况下,指向的self?它应该是一个
功能,但在这里自我看起来像一个对象。ES5填充绑定函数是Javascript

if (!Function.prototype.bind) { 

     Function.prototype.bind = function(obj) { 

     var slice = [].slice, 
     args = slice.call(arguments, 1), 
     self = this, 

     nop = function() {}, 

     bound = function() { 
     return self.apply(this instanceof nop ? this : (obj || {}), // self in this line is supposed 
     to // represent a function ? 
     args.concat(slice.call(arguments))); 
     }; 

     nop.prototype = self.prototype; 
     bound.prototype = new nop(); 
     return bound; 
     }; 
    } 
+0

我知道这是在这个时间点一个古老的问题,但它出现相当高的谷歌搜索分析。接受的答案相当具有误导性。我已经发布了一些新的答案和一些额外的细节。看看你是否感兴趣。 – bigtunacan 2013-12-31 20:42:56

回答

-1

有想法,在JavaScript的几乎一切都是对象。

所以,你必须是正确的有:

自我=这

因此,自我是代表什么不,自实例。

2

self正在您所列的垫片中使用,以适应this随着范围变化而变化的事实。在Function.prototype.bind函数的直接范围内,this将引用调用绑定函数的对象。

一旦你输入嵌套的范围bound函数this已经改变;因此作者已在bind函数中指定self = this以允许在调用bind时调用this的值以通过词法作用域(闭包)保持可用于bound函数。

在JavaScript作用域可以变得相当复杂;有关详细的解释请看这篇文章。

Everything you wanted to know about JavaScript scope.

+0

嗨bigtunacan。同时我学到了很多关于JS的知识,包括它的功能性,面向对象的风格以及课程的范围和封闭性。从这个例子我可以记得,我不明白,原型对象将被对象函数继承。 但无论如何感谢您的回答。 – carousel 2014-01-01 22:56:06