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