1.什么是作用域
简单的来说就是,作用域就是指变量的适用范围;
2.作用域还分全局作用域和函数作用域
全局作用域是window:全局变量,他是随处可见的,可以反复使用,但是他的缺点是,会使全局污染
函数作用域:局部变量,仅在函数内可以用,不可以反复使用
这是我们简单谈到的
3.下面我们来看变量的作用域
变量的作用域无非就是两种:全局变量和局部变量。
全局变量作用域:
这个我们相对我们应该好理解些,全局嘛,我们只要不在局部里面都可以访问到
局部作用域:
和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的,最常见的例如函数内部,
在这需要注意的是,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
<scritpt>
function fun(){
a = 100;
}
fun();
console.log(a);//此时的a是等于100
</script>
为什么呢?
这就是不用var关键字的后果,虽然你是想声明一个局部变量的但是你没有使用var关键字,所以导致这个a变成了全局变量(这是我简单写的一个变量名a,一般我们在写代码时,要规范化)
我们重点来看一下局部的
<scritpt>
var a = 200;
function fun(){
console.log(b);//undefined
var b= 100;
console.log(b);//100
}
fun();
console.log(a);//200
</script>
【这又是为什么呢?
来,我们继续来分析首先我们来看这里面那些事全局变量,那是局部变量,我们从上往下看,a就是全局变量(还不明白的请看上面的全局变量的定义)继续找我们会看到console.log(b);//undefined和局部变量 var b= 100;有人就会问,不是局部变量b有值吗,为什么两个输出b的值不一样呢?第一个输出就是只要函数内定义了一个局部变量,函数在解析的时候都会将这个变量“提前声明”; (这句话的意思就是当有局部变量的时候,函数在调用之前会把变量提前,值留在原地这个过程,所以此时的变量是没有值得,所以才是空)继续往下走此时var b= 100;所以才输出100的,下面全局变量的输出就不用多说了。】这个还不懂的下去自己多练习
1.变量在当前环境now、内部环境f1,内部深层环境f2/f3...都起作用的现象形成了一个链条,这个链条就成为变量的"作用域链"
2. 作用域链的作用
2.1 变量必须"先声明,后使用"
函数可以"先使用,后声明",原因是函数有预加载的过程(函数声明先于其他执行代码进入内存).本质还是函数声明在前,使用在后.
2.2 内部环境变量可以访问外部环境的变量,反之不然.
环境: 每一个函数内部都是一个环境,最外边是全局环境.
类型: 函数环境、全局环境
2.3 变量的作用域是声明时觉得的,而不是运行时
3. AO活动对象
Active Object 活动对象(抽象的)
执行环境:
js代码执行是有环境的(全局环境,函数内部环境)
该环境定义了其有权访问的其他数据
环境有一个与之关联的"活动对象AO"
环境中所以的变量和函数都是活动对象AO的属性
全局环境是最外围的执行环境,活动对象是window对象
执行环境中的代码执行完毕后就被销毁
4. 变量的类型及优先
执行环节可以访问变量的类型及优先顺序
内部变量>>>内部函数>>>形参>>>外部变量(函数,形参);