作用域:
作用域就是变量的有效范围,离开了这个范围变量就无法被访问。
- 全局作用域: 全局作用域中声明的变量,任何其他作用域都可以被访问。
- 注意:
- 为window对象动态添加的属性默认也是全局的,不推荐
- 函数中未使用任何关键字声明的变量为全局变量,不推荐
- 尽可能的少的使用全局变量,防止全局变量被污染。
- 全局作用域有哪些? < script /> 标签内部 .js文件
- 全局作用域声明的变量其他作用域能使用
- 局部作用域:
-
函数作用域:在函数内部声明的变量只能再函数内部被访问,外部无法直接访问
总结:
- 函数内部声明的变量,再函数外部无法直接被访问
- 函数的参数也是函数内部的局部变量
- 不同的函数内部声明的变量无法直接互相访问
- 函数执行完毕之后,函数内部的变量实际被清空了。
-
块作用域:再js中使用 {} 包裹的代码成为代码块,代码块内部声明的变量外部将【有可能无法被访问】。
总结:
- let 声明的变量会产生块作用域,var不会产生块作用域
- const声明的常量也会产生块作用域
- 不同代码块之间的变量无法互相访问
- 推荐使用let和const
-
局部作用域分为函数作用域和块作用域,局部声明的变量外部不可以使用
-
预解析
js代码的执行是由浏览器中的javascript解析器来执行,js解析器执行js代码的时候,分为两个过程,预解析过程和代码执行过程。
预解析过程:
- 把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。
- 把韩式的声明提升到当前作用域的最前面,只会提升生明,不提升调用。
- 先提升var,再提升function。
代码执行过程:
// 案例 1
var a = 25;
function abc() {
alert(a);
var a = 10;
}
abc();
// 案例 2
console.log(a);
function a() {
console.log('aaaaa');
}
var a = 1;
console.log(a);
只有var声明的变量才有变量提升,let和const没有