JS预处理阶段、执行阶段的理解

预处理阶段涉及到变量和(以函数声明方式声明的)函数的声明的提早的原理,而且涉及到声明变量冲突时候的一些问题。须要与执行阶段进行必定的区分,进而加深理解。函数

1. 预处理阶段将变量保存在window域中,会扫描用var操做符声明的变量以及用函数声明的方式声明的函数指针。所以会产生变量提早和函数声明提早的效果。spa

须要说明的是:指针

  • 若是变量并无用var声明,如b = 1;那么即便在函数执行阶段将其默认为全局变量,在预处理阶段也不会将其添加到window域中。直到执行到这一条语句的时候,才会将其和对应的值添加。
  • 函数表达式用var声明,因此处理方式与用var声明的其余变量同样。
  • 这段代码:
var a = 1;
     b = 2;

function f (){console.log("11");}

var g = function(){console.log("22");};

   在预处理阶段window域的状况:code

window{
    f : 指向函数,
    a : undefined,
    g : undefined
}

  在执行阶段window域的状况:blog

window{
    f : 指向函数,
    a : 1,
    b : 2,
    g : 指向函数
}

2. 若是声明发生冲突。那么在预处理的时候遵循两个规则:a. 先扫描函数,再扫描var声明的变量;b. 若是与以前的声明发生冲突的是函数,则覆盖;若是是var声明的变量,则忽略,以下面这段代码:io

alert(f);
function f(){ console.log("11"); }
var f = 1;

  alert的将是"f(){console.log("11");}console

相关文章
相关标签/搜索