作用域及作用域链

作用域在JS中是一个很重要的概念,如下是我的理解:

作用域

作用域是变量或者函数可以访问的范围,即作用域控制着变量或者函数的可见性和生命周期。

在js中变量的作用域一般作用域一般分为两类:全局变量、局部变量(此处不解释这两名词的意思,js与其他语言有很大的共通性,我觉得大家很能理解)

全局变量的几种情况: 定义在最外层函数的外部

                                         定义在最外层函数

                                         变量定义时未使用var,直接赋值的变量

                                         所有window对象的属性

局部变量:与全局变量不同,局部变量只能在固定的代码片段中使用。(eg:内部函数定义的变量)此外,js中没有块级作用域,局部作用域是针对函数说的。

作用域链是什么?

作用域链:当代码在一个环境中执行时,会创建变量对象的一个作用域链。

作用域链的作用

保证对执行环境有权访问的所有变量和函数的有序访问。

自己的理解:当一个函数定义时,就有了一个作用域链,在用到这个变量的值时候,先去找内部定义的变量,此时若该变量没有值就向外层一层一层的延伸,若外层找到则该变量的值就确定下来,若一直未找到则为undefine

newC1().name

function C1(name){

if(name){

this.name = name;

}

}

C1.prototype.name ="Tom";

如上述代码,C1中的name默认为undefine,所以其进不去if判断中,但是又因为C1.prototype.name = "Tom"的存在,在prototype中找到了name属性,所以最后打印出来的答案是"Tom"

延长作用域with与try-catch的catch

with与catch都会在作用域的前端添加一个变量,对于with语句来说,会将指定的对象添加到作用域链中。对于catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。

with对象只能使用属性,而不能改变属性

你可能感兴趣的:(作用域及作用域链)