在我阅读关于javascript patterns
/ anti patterns
-
然后 - 我看到了这一部分:
// 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
我没有看到变量名称与函数名称相同 这显然是他们想说的......
答案 0 :(得分:1)
难以调试,因为它是一个匿名函数,堆栈跟踪中没有出现函数名称(例如Firebug):
var getData = function () {
};
最好调试,因为函数名称出现在堆栈跟踪中,但是这会破坏IE,因为该函数与变量同名:
var getData = function getData () {
};
最好调试,因为函数名称出现在堆栈跟踪中,和 IE不会中断,因为该函数的与变量的名称不同 。缺点是,变量有另一个名称作为函数(可能会令人困惑)。而不是&#34; F&#34;你可以使用任何其他角色(但最好总是使用相同的角色来避免混淆):
var getData = function getDataF () {
};
答案 1 :(得分: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);
更清洁,不会污染外部范围。
答案 2 :(得分:0)
var getData = function getData()或var getData = function getDataF()之间没有区别,两者都是命名函数表达式。 关于这种模式的好处是。
它为您提供了递归的能力,因为使用name属性可以通过函数的内部范围递归地调用相同的函数,例如
function faa(){} //声明
var baa = function(){}; //表达式
var caa = function caa(){}; //命名表达式
faa.name; //“faa”
baa.name; //“”
caa.name; //“caa”