Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么对Function.prototype函数的引用不起作用_Javascript - Fatal编程技术网

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)