2011-10-07 37 views
5

我運行一個程序來改變我的JavaScript代碼的某些部分,當它在一個VAR的聲明竊聽作爲這樣的功能:在「var new_function = function name(){};」中定義函數名有什麼好處嗎?在JavaScript?

var some_function = function name(args){ 
//do stuff 
}; 

代碼本身的工作,但我只是想知道,如果它是確定刪除我找到的所有函數的「名稱」(因爲它不會在另一個分析我的javascript的問題中破壞它),或者它可能是我無法看到的任何用法。

刪除 「名」:

var new_function = function(){/*do stuff*/}; 

注:原始文件在第一次發生是在jquery-1.6.4.js在:

jQuerySub.fn.init = function init(selector, context) { 
    if (context && context instanceof jQuery && !(context instanceof jQuerySub)) { 
     context = jQuerySub(context); 
    } 

    return jQuery.fn.init.call(this, selector, context, rootjQuerySub); 
}; 

TY用於提前任何幫助:)

回答

6

函數表達式的標識符name只能在函數本身內訪問。

在您的jQuery示例中,init標識符甚至沒有被使用,所以我認爲命名該函數僅用於調試目的的唯一優點是,調試器將能夠在一長串調用中向您顯示函數名稱。

比較:

anonymous functions on stack

比。

named functions on stack

缺點存在,一個長期存在的錯誤上IE < = 8使有名函數表達式的名稱標識符泄漏到其封閉的範圍,而且,創建了兩個功能對象,例如:

var foo = function bar() {}; 

typeof bar; // "function" on IE 
foo === bar; // false, two different objects 

爲了避免這種錯誤的副作用有幾種解決方法,例如,一個馬上打電話功能內工作,以創建範圍內的函數聲明,並返回它,如:

jQuerySub.fn.init = (function() { 
    function init(selector, context) { 
    //... 
    } 

    return init; 
})(); 

與其他類似的方式,我建議你檢查下面的文章:

+0

一個缺點是有名函數表達式將在IE中創建兩個函數據我所知(或類似的東西)。 –

+1

@FelixKling,添加了一條關於NFE的說明。 – CMS

+0

Ty爲您的答案。我也嘗試過使用firefox 7.0.1,它可以識別函數內部的名字,但是如果沒有。 – Seeker

相關問題