变量的作用域
- 在js中我们把作用域分为全局作用域和局部作用域,全局作用域就是window,在没 有块级作用域概念的时候,每一个函数都是一个局部作用域。
- 其实变量的作用域,就说指变量的有效范围。我们最长说的就是在函数中声明的变 量作用域。
- 当在函数中声明一个变量的时候,如果改变量没有用var关键字去定义那么该变量就 是一个全局变量,但是这样做最容易造成命名冲突。
- 另一种情况就是使用var声明的变量,这时候的变量就是局部变量,只有在该函数内 部可以访问,在函数外面是访问不到的
- 在javascript中,函数可以用来创造函数作用域。在函数中搜索变量的时候,如果该 函数当中没有这个变量,那么这次搜索过程会随着代码执行环境创建的作用域 链往外层逐层搜索,一直搜索到window对象为止,找不到就会抛出一个为定义 的错误。而这种从内到外逐层查找的关系在js中我们称为作用域链
let,const,var的区别与联系
- 在javascript中我们通常使用var会发生变量提升,即脚本开始运行时,变量已经存在了,但是没有值,所以会输出undefined而let不会发生变量提升,这表示在声明它之前,变量是不存在的,这时如果用到它,就会抛出一个错误。
- var 是函数级作用域,let是块级作用域:
{
let a = 10;
var b = 1;
}
a // ReferenceError:a is not defined.
b // 1
容易发生错误:
var a = [];
for(var i = 0; i < 10; i++){
a[i] = function(){
console.log(i);
};
}
a[6](); // 10;
如果将var i 改为 let i 此时a[6](); 结果是6;
- let不允许在相同作用域内,重复声明同一个变量:
function(){
let a = 10;
var a = 1;
}
//报错
function(){
let a = 10;
let a = 1;
}
//报错
- const声明一个只读的常量。一旦声明,常量的值就不能改变
const PI = 3.1415;
PI = 3;
//TypeError: Assignment to constant variable.
- const命令声明的常量也是不提升,只能在声明的位置后面使用。
{
const a = 10;
}
console.log(a);
//报错
- const声明的常量,也与let一样不可重复声明
- 对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。
const t = {};
t.prop = 123;
console.log(t.prop); // 123
t = {}; // 报错
变量的生存周期
除了变量作用域之外,另外一个跟闭包有关的概念就是变量的生存周期,对于全局变 量来说,全局变量的生存周期是永久的,除非我们主动销毁这个全局变量,而对于函 数内部的使用var声明的变量来说,当退出函数是,这些变量就会随着函数的结束而销 毁。