87,907
社区成员
发帖
与我相关
我的任务
分享
function a(){
console.log(aa); //这里aa是undefined ???why,这里不应该是function aa(){console.log(11)} 吗?
if(1){
function aa(){
console.log(11);
}
}
}
a();
function a(){
console.log(aa); //这里aa是function???why
//去掉if
function aa(){
console.log(11);
}
}
a();
var keith='Keith';
(function(){
console.log(keith);
var keith="Rascal";
}); //返回undefined
上面的代码其实可以理解为
var keith='Keith';
(function(){
var keith;
console.log(keith);
keith="Rascal";
}); //返回undefined
这才是 变量声明的提升。
而楼主的例子,是属于函数的提升。函数提升分为两种,一种是函数声明提升,一种是函数表达式提升。
如:
console.log(keith()); // "haha";
function keith(){
return "haha";
}
console.log(rascal()); //"undefined";
var rascal=function(){
return "haha";
}
函数声明会确保在所有代码执行之前声明已经被解析,而函数表达式,如同定义其它基本类型的变量一样,只在执行到某一句时也会对其进行解析。 所以出现了以上的差异。
而楼主把函数声明放在了if 语句内,函数声明此时是有条件的执行。此时函数声明就相当于函数表达式。
如下代码:
typeof foo; // "undefined"
if (true) {
function foo(){ return 1; }
}
else {
function foo(){ return 2; }
}
同时,也可以把函数声明转换为函数表达式的方式,可是代码会显得复杂。
如下:
var foo;
if (true) {
foo = function foo(){ return 1; };
}
else {
foo = function foo() { return 2; };
}
给楼主解释 是为了满足您的好奇心和学习的目的。在实际开发中是非常不建议有条件的执行函数声明的。因为是有浏览器差异问题的。除非楼主是基于Gecko内核的浏览器开发,如fireFox。更何况不同版本的fireFox也会有差异问题。
function a() {
console.log(aa); //这里aa是undefined ???why,这里不应该是function aa(){console.log(11)} 吗?
if (1) {
console.log(aa);//function aa(){console.log(11)}
function aa() {
console.log(11);
}
}
}
真是头疼