JavaScript中判斷原生函數檢查function是否是原生代碼,javascriptfunction

來源:互聯網
上載者:User

JavaScript中判斷原生函數檢查function是否是原生代碼,javascriptfunction

我總是經常碰到需要檢查某個function是否是原生代碼的情況 —— 這是功能測試中一個很重要的內容: 函數是瀏覽器內建支援的,還是通過第三方類庫類比的。要檢測這一點,最簡單的辦法當然是判斷函數的 toString 方法返回的值啦。

JavaScript代碼

判斷函數是否是原生方法其實相當簡單:

// 判斷是否原生函數 function isNative(fn) { // 樣本: // alert.toString() // "function alert() { [native code] }" // '' + fn 利用了js的隱式類型轉換. return (/\{\s*\[native code\]\s*\}/).test('' + fn); }

將函數轉換為字串表示的形式,並且執行正則匹配,這就是實現的原理。

升級版,Update!

;(function() { // 取得Object的toString方法,用於處理傳入參數value的內部(internal) `[[Class]]` var toString = Object.prototype.toString; // 取得原始的Function的toString方法,用於處理functions的反編譯代碼 var fnToString = Function.prototype.toString; // 用於檢測 宿主物件建構器(host constructors), // (Safari > 4; 真的輸出特定的數組,really typed array specific) var reHostCtor = /^\[object .+?Constructor\]$/; // 使用RegExp將常用的native方法編譯為正則模板. // 使用 `Object#toString` 是因為一般他不會被汙染 var reNative = RegExp('^' + // 將 `Object#toString` 強轉為字串 String(toString) // 對所有Regex相關的特殊字元進行轉義 .replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&') // 為了保持模板的通用性,將 `toString` 替換為 `.*?` // 將`for ...`之類的字元替換,相容Rhino等環境,因為他們會有額外的資訊,如方法的參數數量. .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') // 結束符 + '$' ); function isNative(value) { // 判斷 typeof var type = typeof value; return type == 'function' // 使用 `Function#toString`原生方法來調用, // 而不是 value 自己的 `toString` 方法, // 以免被偽造所欺騙. ? reNative.test(fnToString.call(value)) // 如果type 不是'function', // 則需要檢查宿主對象(host object)的情形, // 因為某些(瀏覽器)環境會將 typed arrays 之類的東西當作DOM方法 // 此時可能不匹配標準的Native正則模式 : (value && type == 'object' && reHostCtor.test(toString.call(value))) || false; }; // 可以將 isNative 賦值給你想要的變數/對象 window.isNative = isNative; }());

測試代碼:

isNative(isNative) //false isNative(alert) //true window.isNative(window.isNative) //false window.isNative(window.alert) //true window.isNative(String.toString) //true

javascript 判斷函數是否執行

不知道你是什麼意思.

所以我提供你思路:如果外邊讓執行fn4()那麼你可以自訂一個變數,這個變數必須定義在fn4()外邊!fn4()執行時修改這一變數,在fn6()中檢查是否已經被修改.正如一樓所說,但沒有必要作隱藏文本域的.這樣的好處是如果fn4()在外圍沒有執行的話,在fn6()中還可以進行執行.

這種方法的簡化如下:
//外邊先定義一個變數fn=false;
fn4()
{
//程式碼片段;
return true;
}
fn=fn4();
......
fn6(){
//程式碼片段;
if fn
{
//允許程式碼片段;
}
else
......
}
 
JAVASCRIPT 怎判斷事件調用了哪個函數

1樓是對的,如果沒有name,說明這個事件沒有綁定函數
str.match(/\w*(?=\(\);)/)
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.