作用域在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对象只能使用属性,而不能改变属性