首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >String.call.call型?

String.call.call型?
EN

Stack Overflow用户
提问于 2017-06-12 20:48:39
回答 1查看 848关注 0票数 1

这是正确的(在Google的控制台中运行它):

代码语言:javascript
复制
typeof String.call.call === 'function'

但是当String.call.call()调用它时会抛出一个错误,说它不是一个函数:

Uncaught : String.call.call不是1:13上的函数

为什么试图调用一个函数(根据它的typeof定义)抛出一个错误,说它不是一个函数?它真的是一个函数吗?

注意,这种情况发生在其他类中,如Number、Function或继承.call方法的其他类。

EN

回答 1

Stack Overflow用户

发布于 2017-06-12 21:22:11

让我们尝试将其分解为更易于管理的部分。

String是一个构造函数(或者是一个静态函数/构造函数混合结构,不管您想称它什么),因此它继承了Function.prototype,因为它是一个函数。

call是一个函数,它执行它的上下文( this),在第一个参数中给它上下文:

代码语言:javascript
复制
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,…)

现在,这里有趣的部分是注意到这三个部分是相同的:

代码语言:javascript
复制
'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作为一个函数来执行,这显然不是。

代码语言:javascript
复制
String.call.call();

我希望这是一个有趣和信息丰富的解释。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44508484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档