JavaScript—作用域
通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。
一、作用域(es6之前)
1.全局作用域
在整个script标签或者一个.js文件中。
2.局部作用域(函数作用域)
在函数内部,只在函数内部起效果和作用。
var num = 10;
console.log(num);
function ft(){
var num = 20;
console.log(num);
};
ft();
以上代码中,两个 ‘num’ 不会冲突。
二、变量的作用域
1.全局变量
在全局作用域下的变量。
※ 在函数内部没有声明而直接赋值的变量也属于全局变量。
2.局部变量
在局部作用域下的变量。(在函数内部的变量)
var num1 = 10;
function ft(){
var num2 = 20;
console.log(num1); //①
console.log(num2); //②
};
ft();
console.log(num1); //③
console.log(num2); //④
以上代码中,’num1’ 为全局变量;’num2’ 为局部变量。①②③都可以成功输出,而④则不能成功输出,因为 ‘num2’ 为局部变量,只能在定义它的函数中使用。
函数的形参也可以看作局部变量
3.从执行效率来看全局变量和局部变量
- 全局变量只有在浏览器关闭时才会销毁,比较占内存资源;
- 局部变量当我们程序执行完毕就会销毁,比较节约内存资源。
三、作用域链
如果在函数中还有函数,那么在这个作用域中就又诞生了一个作用域。
根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作”作用域链“。
var num = 10;
function fn(){
var num = 20;
function fun(){
console.log(num);
};
};
例如,在以上代码中,在函数 ‘fun’ 中使用 ‘console.log’ 输出 ‘num’ ,因为在函数 ‘fun’ 没有声明 ‘num’ 变量,所以会向“上一层”函数 ‘fn’ 中查找,即 ‘num = 20’ ,则控制台输出 ‘20’ ;假如在函数 ‘fn’ 中也没有声明 ‘num’ 变量,则会向函数 ‘fn’ 的上一层查找,即 ‘num = 10’ ,以此类推。(就近原则)