2014-03-19 42 views
2

當我讀this articlejavascript patterns/anti patterns -在javascript中命名函數表達式+'F'?

然後 - 我看到這個部分:

// named function expression + 'F' 
//  Benefits: 
//  1. Get's rid of (anonymous function) in stack traces 
//  2. Recurse by calling the name + 'F' 
//  3. Doesn't break an IE (well, unless there's a function name collision of the        sort described here: https://github.com/jashkenas/coffee-script/issues/366#issuecomment-242134) 


var getData = function getDataF() {}; //<----- notice ends with F 

而不是在上一個例子:

var getData = function getData() {}; 

問:

這是什麼件事功能以F結尾?如果函數以F結尾或者不結尾,那麼真的存在差異嗎?(根據文章,有)? F這個psotfix的官方名稱是什麼?

簡而言之:http://i.stack.imgur.com/NwvWa.jpg

編輯

我沒有看到變量名是作爲函數名 這是apprently他們想說的話一樣 ...

+0

@dystroy他們myfunc' VS'myfuncF'之間'區分的問題是什麼其實關於。 (刪除單詞'語法',因爲它可能令人困惑) –

+0

你的問題到底是什麼?如果有區別?就在這裏。 –

+0

@dystroy我的問題是精心設計和問。什麼是這個「F」後綴的東西的正式名稱?沒有在google中找到 –

回答

1

難以調試,因爲它是一個匿名函數並沒有函數名稱出現在堆棧跟蹤(如螢火蟲):

var getData = function() { 
}; 

更好的調試,因爲函數名出現在堆棧跟蹤,這打破IE,因爲該函數具有相同的名稱作爲變量:

var getData = function getData() { 
}; 

更好的調試,因爲福節點名稱出現在堆棧跟蹤中, IE不會中斷,因爲函數具有與變量的名稱不同。缺點是,變量有另一個名稱作爲函數(可能會令人困惑)。取而代之的是「F」,你可以使用任何其他字符(但最好要始終使用相同的字符,以避免混淆):

var getData = function getDataF() { 
}; 
+0

讓我變形! –

0

這命名功能(更正式地,it gives it an identifier也可以從該功能的範圍中調用):

var getData = function getDataF() { 
    throw 48; 
} 

它使得當所述功能作爲值傳遞的差:

var getData = function() { throw 48; } 
getData.call(); 
// ==> "getData" in the stack trace 

var getData = function() { throw 48; } 
(getData).call(); 
// ==> "anonymous function" in the stack trace 

var getData = function getDataF() { throw 48; } 
(getData).call(); 
// ==> "getDataF" in the stack trace 

它還允許從它自己的範圍調用的函數。這經常用於遞歸。取而代之的

function dive(i){ 
    console.log(i); 
    if (--i) dive(i); 
} 
dive(3); 

你可以做

function dive(i){ 
    console.log(i); 
    if (--i) dive(i); 
})(3); 

這是更清潔,不會污染外部範圍。

+0

沒有。這不是他們的意思。你沒有看到這篇文章,因爲前面的例子已經解釋了 –

+0

http://i.stack.imgur.com/NwvWa.jpg –

+0

@RoyiNamir你的問題真的很不清楚。你在「文章」中不瞭解什麼? –

0

var getData = function getData()或var getData = function getDataF()之間沒有區別,都是命名函數表達式。 這種模式的好處是。

  1. 它提供了在調試期間對調用堆棧的可見性,因爲函數對象的name屬性將被設置。
  2. 它爲您提供遞歸,因爲使用的名稱屬性,您可以通過內部範圍的功能,例如

    功能FAA(){} //聲明

    變種咩遞歸調用相同的功能的能力= function(){}; //表達式

    var caa = function caa(){}; //命名錶達式

    faa.name; //「faa」

    baa。名稱; //「」

    caa.name; //「民航局」

相關問題