Javascript 为什么对Function.prototype函数的引用不起作用
为什么第二种情况不起作用Javascript 为什么对Function.prototype函数的引用不起作用,javascript,Javascript,为什么第二种情况不起作用 // 1. works Object.prototype.hasOwnProperty.call({a:1}, 'a'); // 2. does not work var hasProp = Object.prototype.hasOwnProperty.call; hasProp({a:1}, 'a'); 请注意,所有函数都共享从中继承的相同方法 对函数调用call时,该函数将成为call的this值,因此call可以调用该函数。这是您的第一个代码的情况,它是有效
// 1. works
Object.prototype.hasOwnProperty.call({a:1}, 'a');
// 2. does not work
var hasProp = Object.prototype.hasOwnProperty.call;
hasProp({a:1}, 'a');
请注意,所有函数都共享从中继承的相同方法 对函数调用
call
时,该函数将成为call
的this
值,因此call
可以调用该函数。这是您的第一个代码的情况,它是有效的
但是,在第二个代码中,您不能将call
作为对象的方法调用。因此,其此
值将在严格模式下为未定义
,或在非严格模式下为全局对象。undefined
和全局对象都不可调用,因此call
将抛出
事实上,您的代码相当于
var hasProp = Function.prototype.call;
hasProp({a:1}, 'a');
如您所见,没有对的引用,因此它无法工作
您可以使用call
来调用call
,并将hasOwnProperty
作为此
值来修复此问题:
var call = Function.prototype.call;
call.call(Object.prototype.hasOwnProperty, {a:1}, 'a');
但更好的办法是创建一个新函数,该函数的行为类似于call
,但其this
值绑定到hasOwnProperty
。您可以使用来实现这一点:
var hasProp = Function.prototype.call.bind(Object.prototype.hasOwnProperty);
hasProp({a:1}, 'a');
可以通过以下方式分离该方法以使其工作:
var hasProp = Function.call.bind(Object.prototype.hasOwnProperty)
哈哈,基本上我看到的是
call.call(…)
。这很有趣。请忽略我之前的评论。这个很好用+正如人们所说,bind
有点像是“分离”的反面,因此得名。你得到的函数带有它的这个
,因此在某种意义上,它与一个特定的对象联系更紧密。请忽略我之前的评论。这个很好用+1.
var hasProp = Function.call.bind(Object.prototype.hasOwnProperty)