8 回答

TA贡献1799条经验 获得超9个赞
function func(){...}
这是函数声明
,将在代码执行前被(完整地)加载到作用域的最前端,因此在代码编写中可以(在同作用域或上层作用域中)后置,即题主所说的先调用再声明。函数声明/变量声明都会被
hoisting
,其中函数声明会被完整前置,而变量声明仅前置声明部分
而不前置赋值部分
。
代码栗子:
(function(){
f1()
f2()
var f1 = function(){}
function f2(){}
})()
运行时:
(function(){
var f1,function f2(){} //hoisting,被隐式提升的声明
f1() //ReferenceError: f1 is not defined
f2()
f1 = function(){}
})()
结论:
js目前就支持题主所说的先调用再声明。


TA贡献1846条经验 获得超7个赞
楼主是怎么得到这个结论的。
alert(a());
function a(){
return 1;
}//1
这样的代码是可以运行的。
alert(a());
var a=function(){
return 1;
}//error: unexpected indentifier
这样的代码才会报错。
因为函数声明会在js解析器解析时候率先解析,保证其他代码执行之前,函数可用。而函数表达式必须要等到代码解析器解析到他所在代码行,才会被解释执行。

TA贡献1883条经验 获得超3个赞
楼主,你没搞懂JS的函数声明提升。
a();
function a(){};
这个是可以执行的,而像下面这样是不行
a(); //a是undefined,a已是已经声明了,因为var a,但是未赋值
var a = function(){};
添加回答
举报