JavaScript 预编译
js三部曲
1.语法分析:对js进行全面扫描检查,分析有没有语法错误,并不会立即执行语句。
2.预编译:在函数执行之前,在你的内存中申请一点空间,存放变量和函数。看了网上很多的文章,也是有了一个更深的理解,我个人理解的话,就是将你的变量声明和函数声明提到所有代码的最前面。
3.解释执行:就是程序读一句执行一句
例如上面的例子,先输出了函数然后输出了数字。
最后执行第三步的时候实际代码如下:
var a;//先定义了a 此时a为undefined
function a(){}//函数定义被提前 此时a是一个函数
console.log(a)//此时打印a是一个函数
a=111;//a被赋值此时a为111
console.log(a)//此时再打印a则打印111
包括函数内部的变量也会提到函数的最顶部:
如下例:
由于函数会提到最上面,所以在函数创建之前调用函数不会报错,函数内部的代码如下:
var c;//在函数内部c的声明被提前,此时c为undefined
console.log(a)//此时打印c,c是undefined
c=13;//此时c被赋值值为13;
console.log(c)//此时在打印c,输出13
JavaScript 作用域
在es6之前只有全局作用域和函数作用域。
1.全局作用域
在最外层定义的变量是全局变量,所有代码块的内部都可以访问
在外面定义的变量在函数内部可以使用;
2.函数作用域
在函数内部定义的变量,只有函数内部可以访问
上面的例子
第一次打印输出12,是show();打印的,
第二次输出12,是heqa();打印的,
在第一层函数内部的第二层函数可以使用变量c,而在最外层的打印语句只能打印全局变量,所以报错了;
3.块级作用域
例如下面两张图
我们看第一张图,在第一个if语块里用var定义了变量wb,而在第二个if语块里依然可以使用这个变量。
而第二张图,使用let定义的变量无法在其他的语块里使用
使用es6中新增加的let或const创建变量,创建的变量在指定的代码块外无法使用。
并且使用let声明的变量无法提到代码块的最上面如下图: