js关于变量提升规则

341 阅读1分钟

js变量的提升问题

例:

var tmp = new Date();
function f(){
    console.log(tmp);
    if(false){
        var tmp = "How are you?";
    }
}

f();//输出undefined
  • 函数中if代码块的外部使用外层的tmp变量,内部使用内层的tmp变量。但是,函数f执行后,输出结果为undefined,原因在于变量提升,导致内层的tmp变量覆盖了外层的tmp变量。
  • 但是为什么输出的是undefined?

  • js中有两种作用域,全局作用域和函数作用域。
  • javascript代码执行分为两个阶段:第一个阶段就是在语法环境中注册所有变量和函数的声明,也就是解析;第二个阶段就是执行代码 例如:var str = 'sdfddd';看做是一个声明,而实际上javascript引擎并不这么认为。它将var str和str = 'sdfddd'看做是两个单独的声明,第一个是编译阶段的任务,而第二个则是执行阶段的任务。
  • javascript仅提升声明,不提升初始化 如果先使用变量,然后再声明并初始化此变量,那么变量的值为undefined
  • 1.所有声明都会提升到作用域的顶端,这个过程被称为提升
  • 2.同名变量只会声明一次,其它会被忽略
  • 例:
tmp = 1;
var tem = 2;
var tem;
console.log(tmp);//输出2,证明同名变量只声明一次,其它会被忽略