2011-10-07 110 views
5

我运行一个程序来改变我的JavaScript代码的某些部分,当它在一个VAR的声明窃听作为这样的功能:在“var new_function = function name(){};”中定义函数名有什么好处吗?在JavaScript?

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); 
}; 

TY用于提前任何帮助:)

回答

6

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

在您的jQuery示例中,init标识符甚至没有被使用,所以我认为命名该函数仅用于调试目的的唯一优点是,调试器将能够在一长串调用中向您显示函数名称。

比较:

anonymous functions on stack

比。

named functions on stack

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

var foo = function bar() {}; 

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

为了避免这种错误的副作用有几种解决方法,例如,一个马上打电话功能内工作,以创建范围内的函数声明,并返回它,如:

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

    return init; 
})(); 

与其他类似的方式,我建议你检查下面的文章:

+0

一个缺点是有名函数表达式将在IE中创建两个函数据我所知(或类似的东西)。 –

+1

@FelixKling,添加了一条关于NFE的说明。 – CMS

+0

Ty为您的答案。我也尝试过使用firefox 7.0.1,它可以识别函数内部的名字,但是如果没有。 – Seeker

相关问题