2013-04-24 75 views
1

我有時看到這種模式使用在javascript中的函數聲明中命名函數有什麼好處?

function foo() { 
    this.bar = function bar() { 
     // code 
    } 
} 

的優點是什麼/之所以命名的功能,而不是它作爲一個匿名函數?

爲了進一步說明/澄清:

function foo() { 
    this.bar = function bar() { 
     bar.someVar = 1; 
    } 
} 

Vs的

function foo() { 
    this.bar = function() { 
     this.someVar = 1; 
    } 
} 

感謝

+1

可能的重複 http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascrip – MasNotsram 2013-04-24 10:57:00

回答

0

命名的function的主要好處是允許它是self-referential,尤其是對遞歸:

如果你想引用當前函數的函數體裏面,你需要創建一個命名函數表達。這個名稱僅限於函數體(scope)。這也避免了使用非標準的arguments.callee屬性。

var math = { 
    'factorial': function factorial(n) { 
    if (n <= 1) 
     return 1; 
    return n * factorial(n - 1); 
    } 
}; 

即,沒有它不必知道它保持對象和引用屬性名稱,它可以改變:

// a contrived and hopefully unrealistic example 

function foo() { 
    this.bar = function() { 
     return this.bar; 
    }; 
} 

console.log(new foo().bar());  // Function 
console.log(new foo().bar.call({})); // undefined, `{}` doesn't have a `bar` 

如前所述,它是一個可用的溶液到部分「 取締「的arguments.callee

:你應該避免使用arguments.callee(),並給每個函數(表達式)一個名字。

警告:第5版ECMAScript禁止在strict mode中使用arguments.callee()

0

我想根本的是,你可以回答一個問題你的問題。這個問題是,如果你不指定函數,你會怎麼去明確地在其他地方調用函數呢?

當然,您提供的示例仍然可以在沒有名稱的情況下工作,所以我建議開發人員對個人的偏好儘可能多,因爲它關乎任何功能。我個人喜歡將我的函數命名爲更容易的調試,重用和可讀性以及顯式調用它們的用處。

通過創建一次函數並重用它們,還有明顯的性能優勢。

相關問題