1.1作用域
- 作用域:代码的作用范围,一段代码起作用的区域
全局作用域: 在函数外面定义的变量
全局位置定义的变量称为全局变量, 会保存在一个叫window对象里面
全局变量的生命周期:页面一打开变量就起作用了,页面已关闭,变量就起作用了
- 全局作用域里面定义的变量,哪哪都能访问
var n = 20;
console.log(n);//20
function fn() {
console.log(n);
}
fn();//20
console.log(n);//20
- 局部作用域定义的变量,只能在函数作用域内部使用,外部访问不到
局部变量的声明周期:函数调用时产生,函数调用结束消失
function fn(){
var n = 10;
}
fn();
console.log(n);//n is not defined
- js中 不是所有的{}都用于作用域 像 if(){} for(){} while(){}不能形成作用域
1.2 变量的赋值和访问规则
变量的访问(获取)规则:
- 局部位置访问变量时,就近原则:先找局部作用域下的变量,找到就不找了,如果局部作用域里面没有,向上找,直到全局都没有,就报错.
var x = 10;
function fn(){
var x = 20;
console.log(x); //20
}
fn();
var x = 10;
function fn(){
console.log(x);//10
}
fn();
function fn(){
console.log(x); // x is not defined
}
fn();
- 变量的赋值(获取)规则: 遵循就近赋值
var x = 10;;
function fn() {
var x = 20; //初始值
x = 30; //重新赋值
console.log(x); // 30
}
fn();
console.log(x); // 10
- 赋值也好,访问也好,先找局部,再找全局
var x = 10;; //初始值
function fn() {
x = 30; // 先找一找 函数内部有没有定义局部变量x, 向上找,找了一个叫x的变量 , 全局位置的x已经被重新赋值了 x = 30;
console.log(x); //30
}
fn();
console.log(x); //30
1.3变量的提升
- JavaScript 中,变量的声明都将所有声明部分提升到当前作用域的最顶部
- 对于变量:变量的声明部分会提升,初始化的值不会。
- 对于函数,函数整体都会被提升。
变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部
请注意,变量赋值并没有被提升,只是声明被提升了。