作者mrbigmouth (大嘴先生)
看板Ajax
标题Re: [问题] javascript 函数的提升
时间Thu May 12 20:00:34 2016
※ 引述《kisha024 (4545454554)》之铭言:
: ※ 引述《mrbigmouth (大嘴先生)》之铭言:
: : 两个问题其实是一个解答,
: : function two() {
: : }
: : 这种直接以function开头的宣告语法是一个包含了「宣告」与「定义」的动作:
: : 「宣告一个名称为two的function并定义其内容」
: : 在系统进行hoisting的时候会被一口气提升到scope最前方。
: : var two = function() {
: : }
: : 这段语法其实是「创建一个匿名function」「并将其位址指派给two变数」的分解动作
: : 於是系统进行hoisting时候被提升的只有var two,
: : =指定运算式是不会被提升的。
: : 所以你执行hoistFun()时log two会跑出undefined,
: : 因为该匿名function尚未指给two变数
: : 此外,匿名function没有名称,在系统debug时或Error stack里会以
: : (anonymous function)的方式显示,造成追溯code时的麻烦,
: : 如果可以,尽可能给function一个名称是比较好的设计方式。
: 谢谢 想再请问 您说的'尽可能给function一个名称是比较好的设计方式'是指第一种吗?
对
: 另一个问题是 第二种和第三种在使用上 都是写two() 那两者有什麽差别吗?
: 谢谢
: 第一种
: function two() {
: console.log('global two');
: }
: 第二种
: var two = function() name{
: console.log('local two');
: }
我猜你想表示的是这样写
var two = function name() {
console.log('local two');
}
这种写法可以给定function的名称(name),
也不会随便产生变数(不会产生变数name),
也不会hoisting产生执行上的认知混乱(执行到two = ...之前two为undefined),
在error发生或debug时也能在stack上追溯到function名称(name),
理论上是最好的宣告function方式。(如果你有足够的名称来命名 XD)
可惜的是,部份早期浏览器(其实就是IE啦)不支援这种写法,
不过不要问我要哪一版IE才支援,我没记这个 XD
: 第三种
: var two = function() {
: console.log('local two');
: }
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.164.62.214
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Ajax/M.1463054436.A.668.html
※ 编辑: mrbigmouth (1.164.62.214), 05/12/2016 20:01:11
1F:→ grence: var a=function a1(){console.log(a == a1)}; a(); 05/13 00:55
※ 编辑: mrbigmouth (211.75.132.13), 05/13/2016 15:51:03
2F:→ mrbigmouth: 结果自己也少掉了括号 感谢提醒 XD 05/13 15:51