做用域及做用域链

1.什么是做用域函数

简单的来讲就是,做用域就是指变量的适用范围;spa

2.做用域还分全局做用域和函数做用域orm

全局做用域是window:全局变量,他是随处可见的,能够反复使用,可是他的缺点是,会使全局污染对象

函数做用域:局部变量,仅在函数内能够用,不能够反复使用ip

这是咱们简单谈到的内存

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

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

全局变量做用域:io

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

局部做用域: 

和全局做用域相反,局部做用域通常只在固定的代码片断内可访问到,而对于函数外部是没法访问的,最多见的例如函数内部,

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

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

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

相关文章
相关标签/搜索