在javascript中命名函数表达式+'F'?

时间:2014-03-19 09:43:41

标签: javascript

在我阅读关于javascript patterns / anti patterns -

this article

然后 - 我看到了这一部分:

// 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

修改

我没有看到变量名称与函数名称相同 这显然是他们想说的......

3 个答案:

答案 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()之间没有区别,两者都是命名函数表达式。 关于这种模式的好处是。

  1. 它在调试期间为您提供了对callstack的可见性,因为将设置函数对象的name属性。
  2. 它为您提供了递归的能力,因为使用name属性可以通过函数的内部范围递归地调用相同的函数,例如

    function faa(){} //声明

    var baa = function(){}; //表达式

    var caa = function caa(){}; //命名表达式

    faa.name; //“faa”

    baa.name; //“”

    caa.name; //“caa”