在“var new_function = function name(){};”中定义函数名是否有任何好处?在JavaScript中?

时间:2011-10-07 18:43:44

标签: javascript

我正在运行一个程序来更改我的javascript代码的某些部分,当它在var的声明中出错时就像这样的函数:

var some_function = function name(args){
//do stuff
};

代码本身有效,但我只是想知道是否可以删除我发现的所有函数的“名称”(因为它不会在分析我的javascript的其他问题中破坏它)或者如果它可能是我无法看到的任何用途。

删除“名称”:

var new_function = function(){/*do stuff*/};

注意:首次出现的原始文件位于jquery-1.6.4.js中:

jQuerySub.fn.init = function init( selector, context ) {
    if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
        context = jQuerySub( context );
    }

    return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
};
事先得到任何帮助:)

1 个答案:

答案 0 :(得分:6)

函数表达式的name标识符只能在函数本身中访问。

在你的jQuery示例中,甚至没有使用init标识符,所以我认为将函数命名为调试目的的唯一优势是,调试器将能够在长时间显示函数名称一堆电话。

比较

anonymous functions on stack

Vs以上。

named functions on stack

存在缺点,IE< = 8上的长期错误使得命名函数表达式将名称标识符泄漏到其封闭范围,而且创建了两个函数对象,例如:

var foo = function bar() {}; 

typeof bar; // "function" on IE
foo === bar; // false, two different objects

为了避免这个bug的副作用,有几种解决方法,例如,在一个直接调用的函数内部工作,在该范围内创建一个函数声明,并返回它,例如:

jQuerySub.fn.init = (function () {
  function init( selector, context ) {
    //...
  }

  return init;
})();

和其他类似的方法,我建议你查看以下文章: