2013-10-09 32 views
2

匿名函數我想知道是什麼這之間的區別:要在「常規」匿名的方式非匿名與在JavaScript

var o = { 
    name: 'John', 
    getName: function getName() { 
     console.log(arguments.callee.name + ' was called'); 
    } 
} 

o.getName(); 

var o = { 
    name: 'John', 
    getName: function() { 
     console.log('getName was called'); 
    } 
} 

o.getName(); 

因爲,很顯然第一個似乎有一些好處... 任何垮臺?

+1

[var functionName = function(){} vs function functionName(){}](http://stackoverflow.com/questions/336859/var-functionname-function-vs-function-functionname) – Tibos

+0

@ Tibos-我不認爲它是這些問題的重複,它是關於函數表達式和函數聲明的。這個問題是關於命名函數表達式的。 – RobG

回答

2

任何垮臺?

是的。

一些問題,我會與

var o = { 
    name: 'John', 
    getName: function getName() { 
     console.log('getName was called'); 
    } 
}; 

如果你有一個名爲功能(這對於調試調用堆棧效益)的進入,而且該log()作品仍然。

+0

這種方法是否可以解決quirksy引擎中的問題? – Guy

+0

不,我不關心他們(這個問題並沒有真正導致錯誤的代碼)。如果你這樣做,你應該使用函數聲明,然後將其分配給屬性。看看http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html – Bergi

1

唯一的區別是你的第一個例子產生了一個命名的函數,而你的第二個例子沒有。命名函數在編寫錯誤處理程序時可能很有用,因爲您可以在上下文中獲取函數的名稱。我相信他們還有其他用途,但我知道檢索這個名字並不一定是跨瀏覽器友好的,所以不要在每一個瀏覽器上工作。

Live Demo

var myFunctionVar = function test(){ 
    alert(arguments.callee.name); 
}; 

var myFunctionVar2 = function(){ 
    alert(arguments.callee.name); 
}; 

myFunctionVar(); 

myFunctionVar2(); 

由於RobG和BERGI都指出有在使用上面的代碼的問題,所以請在使用前做一些更多的研究。

+0

IE中存在[錯誤](https://groups.google.com/forum/#!msg/comp。 lang.javascript/qt_UPJW6wcg/6LwEsAOLUFsJ)實現了命名函數表達式,這些函數表達式被長期推薦爲它們的基礎。也許他們已經修復了更新的版本,但IE 8仍然擁有合理的用戶份額。 – RobG