摘要:但有些時(shí)候我們可能需要知道現(xiàn)在某個(gè)到底是否為運(yùn)行時(shí)環(huán)境所原生支持,還是代碼支持的。今天在學(xué)習(xí)版本的源代碼時(shí),就發(fā)現(xiàn)了中也有用來檢測(cè)一個(gè)函數(shù)是否為運(yùn)行時(shí)原生支持。
在開發(fā)過程中,對(duì)于某些API在現(xiàn)有的JavaScript運(yùn)行時(shí)環(huán)境不支持的時(shí)候,我們大都會(huì)采用加入polyfill來解決這個(gè)問題。但有些時(shí)候我們可能需要知道現(xiàn)在某個(gè)API到底是否為運(yùn)行時(shí)環(huán)境所原生支持,還是polyfill代碼支持的。今天在學(xué)習(xí)Vue 2.X版本的源代碼時(shí),就發(fā)現(xiàn)了Vue中也有用來檢測(cè)一個(gè)函數(shù)是否為運(yùn)行時(shí)原生支持。
function isNative (Ctor) { return typeof Ctor === "function" && /native code/.test(Ctor.toString()) }
注意:上述代碼是我去除Vue中有關(guān)于(flow)類型聲明信息后所得
首先,檢測(cè)要被檢測(cè)者是否是函數(shù)類型,然后會(huì)檢測(cè)這個(gè)被檢測(cè)的函數(shù)toString之后的字符串中是否帶有native code字眼,如果符合這兩個(gè)條件,那么說明被檢測(cè)者是一個(gè)當(dāng)前JavaScript運(yùn)行時(shí)原生支持的函數(shù)。
有些人可能會(huì)問:為什么要檢測(cè)這個(gè)被檢測(cè)的函數(shù)toString之后的字符串中是否帶有native code字眼,為此我去看了ECMA-262最新規(guī)范,很遺憾我沒有找到依據(jù),所以我只能退而求其次去看了MDN和MSDN,看看上面怎么說。
MDN上在關(guān)于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()方法是由內(nèi)建函數(shù)(即JavaScript自帶函數(shù))或者是一個(gè)經(jīng)過調(diào)用Function.prototype.bind方法后返回的綁定了上下文的函數(shù) 所調(diào)用時(shí),返回的結(jié)果就是
"function () { [native code] }"
微軟MSDN上關(guān)于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. |
可以看到在內(nèi)建對(duì)象并且類型為Function時(shí),調(diào)用toString()時(shí),返回的也是:
"function functionname( ) { [native code] }"
結(jié)論:當(dāng)一個(gè)對(duì)象為JavaScript運(yùn)行時(shí)build-in object (內(nèi)建對(duì)象),并且類型為Function類型時(shí),對(duì)其調(diào)用toString()方法后,返回的結(jié)果字符串就是如下:
"function functionname( ) { [native code] }"
所以我們可以根據(jù)這一特性來得出如何去檢查一個(gè)函數(shù)是否為JavaScript運(yùn)行時(shí)環(huán)境內(nèi)建函數(shù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/94032.html
摘要:語言中規(guī)定的類型為以及。這兩個(gè)值有不同的類型。內(nèi)建類型定義了七種內(nèi)建類型中新增提示以上類型,除的被稱為基本類型。新增列出的六種類型的值都會(huì)返回一個(gè)對(duì)應(yīng)類型名稱的字符串。是中新增的數(shù)據(jù)類型,我們會(huì)在第三章詳細(xì)介紹。 譯者的前言 一直都想好好研究這個(gè)在 GitHub 上很有名氣的系列,而翻譯恰是最好的閱讀途徑之一。可以讓我閱讀的時(shí)候,不那么不求甚解。 圖靈社區(qū)出版了該系列兩部分的中文版——...
摘要:簡(jiǎn)介項(xiàng)目命名為就是一個(gè)服務(wù)器單純開發(fā)一個(gè)服務(wù)器的想法,變成構(gòu)建網(wǎng)絡(luò)應(yīng)用的一個(gè)基本框架發(fā)展為一個(gè)強(qiáng)制不共享任何資源的單線程,單進(jìn)程系統(tǒng)。單線程弱點(diǎn)無法利用多核錯(cuò)誤會(huì)引起整個(gè)應(yīng)用退出,應(yīng)用的健壯性大量計(jì)算占用導(dǎo)致無法繼續(xù)調(diào)用異步。 NodeJs簡(jiǎn)介 Ryan Dahl項(xiàng)目命名為:web.js 就是一個(gè)Web服務(wù)器.單純開發(fā)一個(gè)Web服務(wù)器的想法,變成構(gòu)建網(wǎng)絡(luò)應(yīng)用的一個(gè)基本框架.Node發(fā)展...
摘要:注意句柄棧并不是調(diào)用棧中的一部分,但句柄域卻在棧中。一個(gè)依賴于構(gòu)造函數(shù)和析構(gòu)函數(shù)來管理下層對(duì)象的生命周期。對(duì)象模板用來配置將這個(gè)函數(shù)作為構(gòu)造函數(shù)而創(chuàng)建的對(duì)象。 如果你已經(jīng)閱讀過了上手指南,那么你已經(jīng)知道了如何作為一個(gè)單獨(dú)的虛擬機(jī)使用 V8 ,并且熟悉了一些 V8 中的關(guān)鍵概念,如句柄,域 和上下文。在本文檔中,還將繼續(xù)深入討論這些概念并且介紹其他一些在你的 C++ 應(yīng)用中使用 V8 的...
摘要:當(dāng)運(yùn)行函數(shù)的時(shí)候,只能訪問自己的本地變量和全局變量,不能訪問構(gòu)造器被調(diào)用生成的上下文的作用域。如何建立一個(gè)更安全一些的沙箱通過上文的探究,我們并沒有找到一個(gè)完美的方案在建立安全的隔離的沙箱。 showImg(https://segmentfault.com/img/remote/1460000014575992); 有哪些動(dòng)態(tài)執(zhí)行腳本的場(chǎng)景? 在一些應(yīng)用中,我們希望給用戶提供插入自定義...
閱讀 2153·2021-09-07 10:24
閱讀 2146·2019-08-30 15:55
閱讀 2124·2019-08-30 15:43
閱讀 731·2019-08-29 15:25
閱讀 1151·2019-08-29 12:19
閱讀 2001·2019-08-23 18:32
閱讀 1598·2019-08-23 17:59
閱讀 1014·2019-08-23 12:22