一个关于js变量提升的问题

chenshiforever 2016-08-02 01:38:02

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();
...全文
149 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenshiforever 2016-08-23
  • 打赏
  • 举报
回复
引用 4 楼 zzgzzg00 的回复:
ie 7 8 和chrome分别看结果
大神解释在你楼下。。。你仔细看看吧~~~~
chenshiforever 2016-08-23
  • 打赏
  • 举报
回复
引用 1 楼 perhapschen 的回复:
运行结果都是 function aa(){ console.log(11); }
你用chrome最新版或者ff最新版测试看,答案应该都是undefined
chenshiforever 2016-08-23
  • 打赏
  • 举报
回复
引用 5 楼 KeithChou_ 的回复:
我想楼主可能理解错了,这不是变量声明提升的问题,而是函数声明提升的问题。 变量声明提升:
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也会有差异问题。
呀。。。。。非常感谢大神带飞,但是我在360浏览器测试的返回的是function,360的chrome内核是45版本,还有在ie9测试的返回的也是ie9,原谅我就是不升级浏览器。。好吧,今天又问了很多大神,然后我认为最为贴切的就是chrome支持ES6,然后if就有了块级作用域
esft 2016-08-02
  • 打赏
  • 举报
回复
我的理解是: 例一中的 函数定义 声明在了 Block块中{...}, 而ECMASCRIPT规范定义 函数声明是不能出现在Block块{...}中的, Block块{...}中出现的只能是表达式.表达式是不会提升的,只是在执行到该语句时才解析 所以例一并没有出现函数提升,因此 console.log(aa);是undefined 例二出现了函数提升. 根源就是Block块 中只能是表达式. 说的不对还请拍砖.
KeithChou_ 2016-08-02
  • 打赏
  • 举报
回复
我想楼主可能理解错了,这不是变量声明提升的问题,而是函数声明提升的问题。 变量声明提升:
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也会有差异问题。
似梦飞花 2016-08-02
  • 打赏
  • 举报
回复
ie 7 8 和chrome分别看结果
似梦飞花 2016-08-02
  • 打赏
  • 举报
回复
第一个问题在不同浏览器看是不同的 在低版本不是undefined 因为在es新版本标准中定义了function的块级作用域,老浏览器没实现
chenshiforever 2016-08-02
  • 打赏
  • 举报
回复
引用 1 楼 perhapschen 的回复:
运行结果都是 function aa(){ console.log(11); }
不是啊,第一个的结果是undefined
cocotsau 2016-08-02
  • 打赏
  • 举报
回复
运行结果都是 function aa(){ console.log(11); }
esft 2016-08-02
  • 打赏
  • 举报
回复
上面说的好像也不对,如果没发生函数提升,那下面代码又无法解释了

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);
                }
            }
        }
真是头疼

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧