JavaScript 预编译&&作用域

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声明的变量无法提到代码块的最上面如下图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值