function aa(){
if(typeof name === 'undefined'){
var name = "Jack";
console.info('Goodbye '+ name);
}else{
console.info('Hello ' + name);
}
}
aa();//Goodbye Jack
为什么这里,没有函数声明的提升? name 不应该是提升了吗?
var name = 'World';
(function(){
if(typeof name === 'undefined'){
var name = "Jack";
console.info('Goodbye '+ name);
}else{
console.info('Hello ' + name);
}
})();
这里的是不是立即调用函数就访问不到外面的 World变量
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
你第二个应该结果和第一个一样吧,并不是你想的那样访问不到外面的name变量了,而是你在这个自执行的函数中声明了name变量,name变量在执行上下文时会被提前声明,所以不可能访问到外面的,因为你的局部(函数内)就有这个name变量啊,js就不会再沿着作用域链向上去找了啊。
你的代码相当于:
要想访问到外面的name变量的话,需要把局部变量名字改掉
变量提升只会提升声明部分,变量赋值不会被提升。详情见这里
楼上几个答案不是本身说的就是错的,就是点好奇怪,不知道在说什么。
容我简化一下问题:
如果将
[2]注释掉的话,[1]会输出"Jack"如果就像现在的这种情况,没有注释
[2]的话,[1]就会输出undefined,因为在当前作用域中存在这么一句var name,变量声明会提到当前域的最前面,但是赋值语句还是在[2]的位置,所以现在的情况是:在
[1]之前,会先运行var name;,所以这个时候的name是undefined的;运行
[1],这时候当然会输出undefined;运行
[2],此时的[2]相当于:name = 'Rose';,没有var,因为变量声明已经被提到最前面了。希望可以帮到你
:P因为变量提升,因此你的函数内部代码执行顺序如下