【问题标题】:ES5 shim for binding functions is Javascript用于绑定函数的 ES5 shim 是 Javascript
【发布时间】:2012-03-28 20:45:56
【问题描述】:

下面是一个用于 JS 绑定的 ES5 shim。我不明白 self。在绑定函数中应用。 我知道如何使用 apply 方法,但是在这种情况下 self 指向哪里?它应该是一个
函数,但这里 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;
        };
  }

【问题讨论】:

  • 我知道这是一个古老的问题,但它在 Google 搜索分析中的排名很高。接受的答案非常具有误导性。我已经发布了一个带有一些额外细节的新答案。有兴趣的可以看看。

标签: binding shim


【解决方案1】:

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

一旦进入嵌套bound的作用域this就发生了变化;因此作者在bind 函数中分配了self = this,以允许在调用bindthis 的值通过词法作用域(闭包)对bound 函数保持可用。

JavaScript 中的作用域会变得相当复杂;有关详细说明,请查看这篇文章。

Everything you wanted to know about JavaScript scope.

【讨论】:

  • 嗨大金枪鱼。与此同时,我学到了很多关于 JS 的知识,包括它的函数性质、面向对象的风格,当然还有 js 的作用域和闭包。从这个例子中,我记得我不明白原型对象将被 - object 的函数继承。但无论如何感谢您的回答。
【解决方案2】:

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

所以你就在那里:

自我 = 这个

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

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 2014-06-20
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多