2015-05-15 57 views

回答

4

注意,所有功能共享相同的call方法,从Function.prototype继承。

Object.prototype.hasOwnProperty.call === Function.prototype.call // true 

当你在一个函数中调用call,该功能成为callthis值,所以call可以调用函数。这是你的第一个代码,它的工作原理。

但是,在您的第二个代码中,不要将call作为对象的方法。因此,其严格模式下的this值将为undefined,或者处于非严格模式的全局对象。 undefined和全局对象都不能被调用,所以call会抛出。

事实上,你的代码就相当于

var hasProp = Function.prototype.call; 
hasProp({a:1}, 'a'); 

正如你所看到的,是hasOwnProperty没有提及,所以它不能正常工作。

您可以修复使用callhasOwnProperty调用call作为this值:

var call = Function.prototype.call; 
call.call(Object.prototype.hasOwnProperty, {a:1}, 'a'); 

但是一个更好的想法是创建一个行为像call而是有其必然hasOwnPropertythis值的新功能。您可以使用bind来实现这一目标:

var hasProp = Function.prototype.call.bind(Object.prototype.hasOwnProperty); 
hasProp({a:1}, 'a'); 
+1

笑,基本上我所看到的是''call.call(。 ..)''。这很有趣。 –

+0

请忽略我以前的评论。这工作正常。 +1 –

4

,可以分离的方法,这种方法以使其工作:

var hasProp = Function.call.bind(Object.prototype.hasOwnProperty) 
+0

就这样说,'绑定'有点儿是“分离”的名称,因此也就是名称。你找回的函数带着它的'this',所以从某种意义上来说,它更与一个特定对象绑定在一起。 – cHao

+0

这很有趣 – Anri

+0

请忽略我以前的评论。这工作正常。 +1 –

相关问题