Javascript 使用';函数()的实例{}';?

Javascript 使用';函数()的实例{}';?,javascript,function,bind,instanceof,prototype-programming,Javascript,Function,Bind,Instanceof,Prototype Programming,在Mozilla Developer Center上,有一个关于此功能的页面,并为不支持此功能的浏览器提供了一个兼容性功能 但是,在分析此兼容代码时,我无法找出他们为什么使用nop的实例nop已设置为function(){}。这与bind上的ECMA规范的哪一部分相对应?什么变量是function(){}的实例 下面返回的false,因此我不完全知道它的用途。当执行instanceof function(){}检查时,哪些内容返回true (function() {}) instanceof (

在Mozilla Developer Center上,有一个关于此功能的页面,并为不支持此功能的浏览器提供了一个兼容性功能

但是,在分析此兼容代码时,我无法找出他们为什么使用nop的实例
nop
已设置为
function(){}
。这与
bind
上的ECMA规范的哪一部分相对应?什么变量是
function(){}
的实例

下面返回的
false
,因此我不完全知道它的用途。当执行
instanceof function(){}
检查时,哪些内容返回true

(function() {}) instanceof (function() {}) // false
代码如下:

Function.prototype.bind = function( obj ) {
    if(typeof this !== 'function')
      throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');

    var slice = [].slice,
        args = slice.call(arguments, 1), 
        self = this, 
        nop = function () {}, 
        bound = function () {
          return self.apply( this instanceof nop ? this : ( obj || {} ), 
                              args.concat( slice.call(arguments) ) );    
        };

    bound.prototype = this.prototype;

    return bound;
};

该实现似乎存在错误<除了
instanceof
检查之外,code>nop从未被用于(实例化任何东西),这对于任何东西都不可能是真的,因为没有对象可以从
nop
实例化,而
nop
被深埋在该闭包中

考虑这一点:

// Identical definition, but different Function instances
var nop = function () {},
    mop = function () {};

var obj1 = new mop;

obj1 instanceof mop // true
obj1 instanceof nop // false

有人删掉了使它有用的部分。这是它过去的样子:

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 || {} ), 
                            args.concat( slice.call(arguments) ) );    
    };

    // These lines are the important part
    nop.prototype = self.prototype;
    bound.prototype = new nop();

    return bound;
};
我在这里回答了另一个问题,问的是同样的问题(但当代码正确时):

此nop
检查实例的原因是,如果您将绑定函数作为构造函数调用(即使用
new
运算符),
绑定到新对象,而不是传递给
bind
的任何对象

为了解释“重要部分”,
nop
基本上是插入到原型链中,这样当您作为构造函数调用函数时,
这个
就是
nop
的一个实例

因此,如果运行
var-bound=original.bind(someObject)原型链将如下所示:

original | nop | bound 起初的 | 不 | 跳跃 我猜他们为什么使用
nop
而不是
self
的这个实例,是因为绑定函数将拥有自己的
原型
属性(继承自
self
)。这可能是不应该的,这可能是它被部分删掉的原因。不管怎样,现在的代码是不正确的,但只要不将函数用作构造函数,它就可以工作