js中什么是作用域
作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。作用域决定了代码区块中变量和其他资源的可见性。
在es5中JavaScript有全局作用域和函数作用域。
全局作用域
全局作用域(全局词法环境)变量和函数都在window这个全局对象中。
何时产生全局作用域:当代码执行到script标签时,就会产生一个全局的词法环境。全局词法环境中有一个对象(window)。这个对象将全局作用域中的变量和函数(内置函数、自定义函数)存到windo中。
例如在script标签内声明一个变量和函数:
输出window看到全局作用域所有变量及函数,也能找到声明的变量和函数。当页面关闭时,全局变量和函数就会销毁。
注:全局作用域有个弊端:如果我们写了很多行 JS 代码,变量定义都没有用函数包括,那么它们就全部都在全局作用域中。这样就会 污染全局命名空间, 容易引起命名冲突。
局部作用域(函数作用域)
局部作用域也有一个类似于window的对象,用来存储函数中的变量和方法。函数作用域,是指声明在函数内部的变量,和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部。
function fun() {
var str = '局部作用域';
function fun1() {
alert(str);
}
fun1()
}
fun();//弹出提示框 局部作用域
alert(str);//脚本错误
fun1();//脚本错误
作用域是分层的,内层作用域可以访问外层作用域的变量,反之则不行。
重要事项: 在函数作用域中,未定义直接赋值的变量变量时,该变量为一个全局变量
function fun() {
var a = b = 10;//从右边往左执行,b = 10;(全局变量) var a = b;
var c = 15, d = 15;//从左往右执行,var c = 15; var d = 15;
}
fun();
console.log(a);//undefined 报错
console.log(b);// 10
console.log(c);//undefined 报错
console.log(d);//undefined 报错