首页 > javascript函数声明表达式问题。

javascript函数声明表达式问题。

var fn1 = function(){};
var fn2 = function abc(){};

问题1:
1.函数表达式,什么情况下赋值匿名函数,什么情况下赋值有名字的函数?


以前没怎么想过这个问题,刚在stackoverflow上看到一个回答,还不错(英语不好,就是感觉很吊的样子)

chrome console 里运行的结果
var s = function ff(){console.log('111');}
    undefined
typeof(ff)
    "undefined"
typeof(s)
    "function"

问题链接:
http://stackoverflow.com/questions/1140089/why-do-you-need-to-invoke-an-anonymous-function-on-the-same-line#answer-1140107


回答:
1.一般将匿名函数赋值给一个变量是为了方便后面的调用
2.函数声明只能出现在程序或函数体内。从句法上讲,它们 不能出现在Block(块)({ ... })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。
详情参阅深入理解JavaScript系列(2):揭秘命名函数表达式


匿名函数的名字只有在函数体内可见,所以使用带名字的匿名函数的唯一目的就是:函数需要引用自身。

例如:

var loop = function fn() { 
    console. log('bingo');
    setTimeout(fn); // 此处调用了自己
}

你可能说了,直接使用loop引用它不就行了。当然可以,但是由于fn的可见范围更小,不会被外界修改,所以更好。


var a = function b(){debugger;};
a();

在控制台试下,你可以看到调用栈是b,方便调试。
否则你只能看到匿名函数。

【热门文章】
【热门文章】