Javascript 使用';函数()的实例{}';?
在Mozilla Developer Center上,有一个关于此功能的页面,并为不支持此功能的浏览器提供了一个兼容性功能 但是,在分析此兼容代码时,我无法找出他们为什么使用nop的实例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 (
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
)。这可能是不应该的,这可能是它被部分删掉的原因。不管怎样,现在的代码是不正确的,但只要不将函数用作构造函数,它就可以工作