首页 > JavaScript中的立即调用函数表达式

JavaScript中的立即调用函数表达式


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. [1]之前,会先运行var name;,所以这个时候的nameundefined的;

  2. 运行[1],这时候当然会输出undefined

  3. 运行[2],此时的[2]相当于:name = 'Rose';,没有var,因为变量声明已经被提到最前面了。

希望可以帮到你 :P

【热门文章】
【热门文章】