变量提升—函数内部中数据初始化问题

今天敲完工作代码,遇见一个小问题。闲话少叙,我先上一段代码,再分析一下。

var nsame = "Sada";
var name = 'World!';
(function () {
    console.log(typeof name === 'undefined')//true          
    if (typeof name === 'undefined') {
        var name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();

(function () {
    console.log(typeof nsame === 'undefined')//false
})();

同样是两个自运行函数,第一个type属性是undefined,第二个却是string。

首先来看看两个函数有什么不同
1.很简单的代码,两个函数,全局声明的变量name,nsame,都是字符串类型,问题明显不在这里。
2.函数外部原因排除,再看看内部有什么不同:

if (typeof name === 'undefined') {
       var name = 'Jack';
       console.log('Goodbye ' + name);
   } else {
       console.log('Hello ' + name);
   }

也只不过多出这么一段if–else–判断语句,而且其中涉及到相同的name变量的声明。先来看看我们改变内部name的使用。看下面一段代码

var nsame = "Sada";
var name = 'World!';
(function () {
    console.log(typeof name)//string    
 if (typeof name === 'undefined') {
     var names = 'Jack';
     console.log('Goodbye ' + name);
 } else {
     console.log('Hello ' + name);//运行 Hello World!
 }
})();
(function () {
    console.log(typeof nsame === 'undefined')//false
})();

这时候问题消失,两者运行结果相同,都读取到了外部变量name或者是nsame。这时候我们逐渐知道了问题的关键。看下边简化问题后的代码,再进行分析。

var name = 'World!';
function ss() {
    console.log(typeof name)//undefined                
    var name = 'Jack';
    console.log('Goodbye ' + name);//Goodbye Jack
};

问题就在这里了,var 声明的作用域在整个 function 中, 但并没有初始化。也就是变量提升。

function ss () {
  var name; // 变量提升,函数作用域范围内
  console.log(name);
  name = 'aaa';
  console.log(a);
}
ss();

除此之外,还存在函数提升

console.log(f1); // function f1() {}   
console.log(f2); // undefined  
function f1() {}
var f2 = function() {}

总结 很简单的东西,不注意还是会被坑。祝大家好运。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值