作用域
JS的作用域:代码名字(变量)在某个范围内起作用和效果
目的:为了提高程序的可靠性,更重要的是减少命名冲突
JS中的作用域(ES6之前)
- 全局作用域(整个script标签或者是一个单独的js文件)
- 局部作用域(函数作用域)在函数内部的就是局部作用域
变量的作用域
根据作用域的不同把变量分为全局变量和局部变量
- 全局变量
- 全局作用域下的变量,在全局下都可以使用
- 在函数内部,没有声明直接赋值的变量也是全局变量
- 局部变量
- 在局部作用域下声明的变量(在函数内部的变量),只能在函数内部使用
- 函数的形参也可以看作局部变量
从执行效率来看全局变量和局部变量
- 在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存
- 在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码块运行结束后,就会被销毁,因此比较节省空间
块级作用域
JS中在ES6之前没有块级作用域
作用域链
- 只要是代码,就至少有一个作用域
- 写在函数内部的是局部作用域
- 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
- 根据在内部函数又可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链
作用域链:内部函数访问外部函数的变量采用的是链式查找的方式来决定取哪个值,这种结构我们称为作用域链(就近原则)
================
案例:
function f1() {
var num = 123;
function f2() {
console.log(num); //=>123 站在目标出发,一层一层往外查找
}
f2();
}
var num = 456;
f1();
预解析(变量提升(声))
JavaScript代码是由浏览器中的JavaScript解析器来完成的,JavaScript解析器在运行JavaScript代码的时候分为两步:预解析和代码执行
- 预解析(变量提升):JS引擎会把JS里面所有带var和function的提升到当前作用域的最前面
- 代码执行:按照代码书写的顺序自上而下执行
预解析分为变量预解析(变量提升)和函数预解析(函数提升)
变量提升:把所有的变量声明提升到当前作用域最前面,不提升赋值操作
函数提升:把所有的函数声明提升到当前作用域最前面,不调用函数
f1();
console.log(c); //=> 9
console.log(b); //=> 9
console.log(a); //=> 报错
function f1() {
var a = b = c = 9;
console.log(a); //=> 9
console.log(b); //=> 9
console.log(c); //=> 9
}
// 函数表达式调用必须写在函数表达式的下面
// 错误示例如下:
fun();
var fun = function(){
console.log(95);
}
// 下面的是正确的:
var fun = function() {
console.log(95);
}
fun();
网友评论