You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Toast();// hello worldshowToast();// shwoToast is not a functionvarshowToast=function(){console.log('123');};functionToast(){console.log('hello world');}
函数声明(funDeclaration)
无论在哪儿定义函数,只要是外层函数并且满足不被包裹,就都可以进行全局范围的调用
在函数体内部的函数声明无法提升到全局,只能提升到函数体内顶部(块级作用域空间)
函数体内部执行:
在外部要想访问函数内部申明的函数,需要先
return
出来:函数表达式(funExpression)
函数表达式需要等到表达式赋值 完成 才可以
demo1
demo2
主流浏览器解析,ie11+
在花括号里面声明的函数在进行预解析时只会提升函数名,不会提升函数体,所以不管 if 条件是否为真,函数体都不会提升,永远是 undefined,接下来随着 if 条件判断进行解析赋值,当然是走 ture 方法。
ie9,ie10
在这里的 ie 将所有的函数声明进行了提升,从而由
sayHey2
替代了sayHey
,函数表达式的在顺着条件判断进行了定义,执行为true
的情况,进行赋值解析。ie8
ie8 在这里处理的比较奇葩,正常的函数申明提升,但是却也将条件判断为假的情况进行了提升,我们看到
typeof (sayHello)=>function
结论
由于函数声明提升的差异,想要在条件判断中定义不同的函数方法,应该采用定义函数表达式的方法,这样就在各个浏览器中拿到相同的函数方法,得到相同的结果。
参考
The text was updated successfully, but these errors were encountered: