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

来源:互联网 发布:python教程书籍下载 编辑:程序博客网 时间:2024/05/16 19:24

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

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() {}

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