这是正确的(在Google的控制台中运行它):
typeof String.call.call === 'function'但是当String.call.call()调用它时会抛出一个错误,说它不是一个函数:
Uncaught : String.call.call不是1:13上的函数
为什么试图调用一个函数(根据它的typeof定义)抛出一个错误,说它不是一个函数?它真的是一个函数吗?
注意,这种情况发生在其他类中,如Number、Function或继承.call方法的其他类。
发布于 2017-06-12 21:22:11
让我们尝试将其分解为更易于管理的部分。
String是一个构造函数(或者是一个静态函数/构造函数混合结构,不管您想称它什么),因此它继承了Function.prototype,因为它是一个函数。
call是一个函数,它执行它的上下文( this),在第一个参数中给它上下文:
console.log(String.call(true));
console.log(Array.call(null));
console.log(Function.call('so?'));
console.log(Object.call(/notice me/));
让我们看一看Function.call()更正式的定义
call()方法调用具有给定this值的function,并分别提供arguments。 function.call(thisArg,arg1,arg2,…)
现在,这里有趣的部分是注意到这三个部分是相同的:
'use strict';
var callRef = String.call; // Function.call, Array.call, Boolean.call, all of them are ===
console.log(String(/make me into a string/));
console.log(String.call(undefined, /make me into a string/));
console.log(callRef.call(String, undefined, /make me into a string/));
callRef.call(String)的意思是使用String的上下文调用String(),也就是说,使用以下参数中提供的上下文和参数执行String()。
我们还记得,上下文并不重要,但是现在我们知道callRef.call()的第一个参数确实很重要,因为它决定要执行什么函数,因为它告诉callRef()它的上下文是什么,它是作为一个函数执行的,在下一个参数中提供了上下文。
现在思考一下最初的问题,当我们尝试执行String.call.call()时会发生什么?如果没有指定一个参数,它就是undefined,我们知道typeof undefined !== 'function'。
这是我最后的答案:
String.call.call()确实是一个函数..。但是它所做的只是尝试将undefined作为一个函数来执行,这显然不是。
String.call.call();
我希望这是一个有趣和信息丰富的解释。
https://stackoverflow.com/questions/44508484
复制相似问题