作用域
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;。防止出现意外。