作用域及作用域链

1.什么是作用域

简单的来说就是,作用域就是指变量的适用范围;

2.作用域还分全局作用域和函数作用域

全局作用域是window:全局变量,他是随处可见的,可以反复使用,但是他的缺点是,会使全局污染

函数作用域:局部变量,仅在函数内可以用,不可以反复使用

这是我们简单谈到的

3.下面我们来看变量的作用域

变量的作用域无非就是两种:全局变量和局部变量。 

全局变量作用域:

这个我们相对我们应该好理解些,全局嘛,我们只要不在局部里面都可以访问到

局部作用域: 

扫描二维码关注公众号,回复: 6998139 查看本文章

和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的,最常见的例如函数内部,

在这需要注意的是,函数内部声明变量的时候,一定要使用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. 变量的类型及优先 

    执行环节可以访问变量的类型及优先顺序

    内部变量>>>内部函数>>>形参>>>外部变量(函数,形参);




猜你喜欢

转载自www.cnblogs.com/zhangli123/p/11331510.html