资讯专栏INFORMATION COLUMN

教你如何检查一个函数是否为JavaScript运行时环境内建函数

miya / 2194人阅读

摘要:但有些时候我们可能需要知道现在某个到底是否为运行时环境所原生支持,还是代码支持的。今天在学习版本的源代码时,就发现了中也有用来检测一个函数是否为运行时原生支持。

在开发过程中,对于某些API在现有的JavaScript运行时环境不支持的时候,我们大都会采用加入polyfill来解决这个问题。但有些时候我们可能需要知道现在某个API到底是否为运行时环境所原生支持,还是polyfill代码支持的。今天在学习Vue 2.X版本的源代码时,就发现了Vue中也有用来检测一个函数是否为运行时原生支持。
function isNative (Ctor) {
  return typeof Ctor === "function" && /native code/.test(Ctor.toString())
}

注意:上述代码是我去除Vue中有关于(flow)类型声明信息后所得

首先,检测要被检测者是否是函数类型,然后会检测这个被检测的函数toString之后的字符串中是否带有native code字眼,如果符合这两个条件,那么说明被检测者是一个当前JavaScript运行时原生支持的函数。
有些人可能会问:为什么要检测这个被检测的函数toString之后的字符串中是否带有native code字眼,为此我去看了ECMA-262最新规范,很遗憾我没有找到依据,所以我只能退而求其次去看了MDN和MSDN,看看上面怎么说。

MDN上在关于Function.prototype.toString()一章上是这么说的:

If the toString() method is called on built-in function objects or a function created by Function.prototype.bind, toString() returns a native function string which looks like
"function () {    [native code]   }"

义译一下就是说:

如果toString()方法是由内建函数(即JavaScript自带函数)或者是一个经过调用Function.prototype.bind方法后返回的绑定了上下文的函数 所调用时,返回的结果就是
"function () {    [native code]   }"

微软MSDN上关于toString Method (Object) (JavaScript)一章中是这么说的:

The toString method is a member of all built-in JavaScript objects. How it behaves depends on the object type:
Object Behavior
Array Elements of an Array are converted to strings. The resulting strings are concatenated, separated by commas.
Boolean If the Boolean value is true, returns "true". Otherwise, returns "false".
Date Returns the textual representation of the date.
Error Returns a string containing the associated error message.
Function Returns a string of the following form, where functionname is the name of the function whose toString method was called:

function functionname( ) { [native code] }
Number Returns the textual representation of the number.
String Returns the value of the String object.
Default Returns "[object objectname]", where objectname is the name of the object type.

可以看到在内建对象并且类型为Function时,调用toString()时,返回的也是:

"function functionname( ) { [native code] }"
结论:当一个对象为JavaScript运行时build-in object (内建对象),并且类型为Function类型时,对其调用toString()方法后,返回的结果字符串就是如下:
"function functionname( ) { [native code] }"
所以我们可以根据这一特性来得出如何去检查一个函数是否为JavaScript运行时环境内建函数

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94032.html

相关文章

  • [你不知道的 JavaScript 类型和语法] 第一章:类型

    摘要:语言中规定的类型为以及。这两个值有不同的类型。内建类型定义了七种内建类型中新增提示以上类型,除的被称为基本类型。新增列出的六种类型的值都会返回一个对应类型名称的字符串。是中新增的数据类型,我们会在第三章详细介绍。 译者的前言 一直都想好好研究这个在 GitHub 上很有名气的系列,而翻译恰是最好的阅读途径之一。可以让我阅读的时候,不那么不求甚解。 图灵社区出版了该系列两部分的中文版——...

    Astrian 评论0 收藏0
  • Node_深入浅出Node

    摘要:简介项目命名为就是一个服务器单纯开发一个服务器的想法,变成构建网络应用的一个基本框架发展为一个强制不共享任何资源的单线程,单进程系统。单线程弱点无法利用多核错误会引起整个应用退出,应用的健壮性大量计算占用导致无法继续调用异步。 NodeJs简介 Ryan Dahl项目命名为:web.js 就是一个Web服务器.单纯开发一个Web服务器的想法,变成构建网络应用的一个基本框架.Node发展...

    shinezejian 评论0 收藏0
  • [译] V8 使用者文档

    摘要:注意句柄栈并不是调用栈中的一部分,但句柄域却在栈中。一个依赖于构造函数和析构函数来管理下层对象的生命周期。对象模板用来配置将这个函数作为构造函数而创建的对象。 如果你已经阅读过了上手指南,那么你已经知道了如何作为一个单独的虚拟机使用 V8 ,并且熟悉了一些 V8 中的关键概念,如句柄,域 和上下文。在本文档中,还将继续深入讨论这些概念并且介绍其他一些在你的 C++ 应用中使用 V8 的...

    lei___ 评论0 收藏0
  • Node.js 应用建立一个更安全的沙箱环境

    摘要:当运行函数的时候,只能访问自己的本地变量和全局变量,不能访问构造器被调用生成的上下文的作用域。如何建立一个更安全一些的沙箱通过上文的探究,我们并没有找到一个完美的方案在建立安全的隔离的沙箱。 showImg(https://segmentfault.com/img/remote/1460000014575992); 有哪些动态执行脚本的场景? 在一些应用中,我们希望给用户提供插入自定义...

    cartoon 评论0 收藏0

发表评论

0条评论

miya

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<