JavaScript中的立即调用函数表达式
阿神
阿神 2017-04-10 16:11:22
[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变量
阿神
阿神

闭关修行中......

全部回复(4)
PHPz

你第二个应该结果和第一个一样吧,并不是你想的那样访问不到外面的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

阿神

因为变量提升,因此你的函数内部代码执行顺序如下

var name;
if(typeof name === 'undefined') {
    name = 'Jack';
    console.info('Goodbye ' + name);
} else {
    console.info('Hello ' + name);
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号