作用域、作用域链、自由变量、变量提升

作用域

1、什么是作用域?

作用域就是一个变量和函数可以使用的范围,主要分为全局作用域和局部(函数)作用域
全局作用域就是Js中最外层的作用域。

2、在JS中有三个作用域

全局作用域:定义全局作用域下的变量,全局任何地方都可以访问。(window环境)
函数作用域:函数也能限制一个变量的访问范围(保护变量)
块级作用域:使用 let 、const 定义的对象,就会产生块级作用域

3、执行分4阶段

开始执行前
定义函数时
函数执行阶段
函数执行后

作用域链

一个变量在当前作用域没有定义,但是被使用了,就会向上级作用域,一层一层依次查找,
直至找到为止,找到这个变量后就会停止,不会继续查找这个变量,如果全局作用域都没有找到这个变量就会报错。

自由变量

假如在全局中定义了变量a,在函数中使用了这个a,这个a就是自由变量,可以这样理解,凡是跨了自己的作用域的变量都叫自由变量。

变量提升

变量提升,很简单,就是把变量提升提到函数的top的地方。我么需要说明的是,变量提升 只是提升变量的声明,并不会把赋值也提升上来。

比如:

我们定义三个变量:
复制代码代码如下:

(function(){
var a='One';
var b='Two';
var c='Three';
})()
 

实际上它是这样子的:

复制代码代码如下:

(function(){
var a,b,c;
a='One';
b='Two';
c='Three';
})()

这个时候就把变量提升了呀。

好,我们现在回到第一段code里面。为什么会报错呢?其实,根据我么根据上面变量提升原件以及js的作用域(块级作用域)的分析,得知 上面代码真正变成如下:
复制代码代码如下:

var v='Hello World';
(function(){
var v;
alert(v);
v='I love you';
})()

所以,才会提示说“undefined”。

从这里,我们也学习到,我们在写js code 的时候,我么需要把变量放在块级作用域的顶端,比如我在上面所举的例子:var a,b,c;。防止出现意外。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值