Javascript中的作用域问题
变量作用域
注意:JavaScript 预编译和执行的先后关系和特点
作用域定义
一个变量的作用域是程序源代码中定义这个变量的区域。
全局变量:拥有全局作用域,在JavaScript代码中的任何地方都是有定义的。
局部变量:作用域是局部性的,只在函数体内有定义,函数参数也是局部变量。
变量作用域优先级
在函数体内,局部变量优先级高于同名的全局变量,全局变量会被函数体内同名的局部变量或参数变量覆盖。
函数作用域
注意:在JavaScript中没有块级作用域概念,取而代之的是函数作用域。
定义
变量在声明它们的函数体以及这个函数体嵌套的任意函数体内部都是有定义的。即函数内声明的所有变量在函数体内是始终可见的。
作为属性的变量
- 通过var声明的变量是不可配置的,不可通过delete运算符删除;
- 给未声明的变量赋值,JavaScript会创建一个可配置的全局变量,可通过delete运算符删除;
- JavaScript全局变量是window全局对象的属性;
- “调用对象”、“声明上下文对象”,this关键字引用全局对象,却没有方法可以引用局部变量中存放的对象。
作用域链
一个对象列表或者链表,这组对象定义了这段代码“作用域中”的变量。
定义一个函数时,它实际上保存一个作用域链。当调用这个函数时,它创建一个新的对象来存储它的局部变量,并将这个对象添加至保存的那个作用域链上。
对于嵌套函数来讲,每次调用外部函数时,内部函数又会重新定义一遍。因为每次调用外部函数时作用域链都是不同的,也就是说内部函数在每次定义的时候都有微妙的差别。