js之预解析


一、所谓的预解析就是:在当前作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义。

1)var声明的变量在预解析的时候只是提前的声明,
2)function声明的函数在预解析的时候会提前声明并且会同时定义。

二、预解析只发生在当前的作用域下
  程序最开始的时候,只对window下的变量和函数进行预解析GO{}
  只有函数执行的时候才会对函数中的变量和函数进行预解析AO{}

三、当函数执行的时候,首先会形成一个新的私有作用域AO{},然后按照如下的步骤执行。
  如果有形参,先给形参赋值;
  进行私有作用域中的预解析;
  私有作用域中的代码从上到下执行

四、在全局作用域中声明变量带var可以进行预解析,所以在赋值的前面执行不会报错;声明变量的时候不带var的时候,不能进行预解析,所以在赋值的前面执行会报错。

五、注意:JS中,如果在不进行任何特殊处理的情况下,上面的代码报错,下面的代码都不再执行了

六、不管条件是否成立,都会把带var的进行提前的声明
  if (!('num' in window)) {
    var num = 12;
  }
  console.log(num); // undefined

七、只预解析“=”左边的,右边的是指针,不参与预解析
var fn = function () { //不会解析
  console.log('ok');
}

var a = b = 1 //解析的时候只会提升var a 而 b 只是没有声明直接赋值,是全局变量。

八、自执行函数:定义和执行一起完成
  自执行函数定义的那个function在全局作用域下不进行预解析,当代码执行到这个位置的时候,定义和执行一起完成了。
 
九、return以下的代码依然会进行预解析
  return中的代码,都是我们的返回值,所以不进行预解析。

十、typeof(a) //undefined, 未声明而使用变量 只有typeof不报错,是undefined

十一、!!是将表达式强制转化为bool值的运算,运算结果为true或false,表达式是什么值,结果就是对应的bool值,不再取非。



注:
  ①、所有的变量声明,都会提升到最顶部,但不会提升赋值

  ②、所有的函数声明,都会提升到最顶部,但不会提升函数的调用

  ③、如果同时有多个 var 声明的相同的变量,后面的 var 将被忽略

  ④、如果同时有多个同名的函数,后面的函数将会覆盖前面的函数

  ⑤、如果声明的变量和声明的函数同名,声明的函数将会覆盖声明的变量



原文地址:https://www.cnblogs.com/zjz666/p/11417488.html