用于绑定功能的ES5垫片是Javascript

时间:2012-03-12 12:47:36

标签: binding shim

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

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;
        };
  }

2 个答案:

答案 0 :(得分:2)

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

输入嵌套bound函数的范围this已更改;因此,作者已在self = this函数中指定了bind,以允许调用thisbind的值通过bound函数保持可用词汇范围(闭包)。

在JavaScript中进行范围设计会变得相当复杂;有关详细说明,请查看本文。

Everything you wanted to know about JavaScript scope.

答案 1 :(得分:-1)

请记住,在javascript 几乎中,一切都是对象。

所以你就在那里:

  

self = this

所以,self不是代表任何东西,self 实例。