Re: [问题] javascript 函数的提升

楼主: mrbigmouth (大嘴先生)   2016-05-12 20:00:34
※ 引述《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');
: }
作者: grence (dalalida)   2016-05-13 00:55:00
var a=function a1(){console.log(a == a1)}; a();
楼主: mrbigmouth (大嘴先生)   2016-05-13 15:51:00
结果自己也少掉了括号 感谢提醒 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com