作用域 起作用的区域;
JS中的作用域分为 全局作用域 私有作用域
JS作用域 就是指的 一块栈内存;
全局作用域: 页面一打开 就会形成一个全局作用域;一个页面只有一个全局作用域
私有作用域: 函数执行的时候会形成一个私有的作用域;
全局变量: 在全局声明的变量叫做全局变量
私有变量: 在私有作用域声明的变量叫私有变量;形参也是私有变量
上级作用域 外层作用域;查找规律:上级作用域是谁,就看这个函数是在那个作用域声明定义的;
对于私有作用域中的某些变量,若没有在私有作用中声明过,那么函数执行时,就会去
上级作用域查找该变量,上级作用域若没有该变量,则接着向上级查找,直到查找到
全局作用域,若仍没有, 则报错;
作用域链:变量的查找机制,一直向上级作用域查找;
函数执行的过程:
先开辟一个私有作用域(栈内存),形参赋值,然后变量提升,然后代码从上向下执行;
私有变量有 形参 和 在私有作用域中声明过的变量;其他的变量都是上级作用域的。
暂时性死区; 在let和const之前 不能使用 他们声明的任何变量
es6针对let和const声明的变量;多了一个块级作用域({});理解成一个私有作用域即可
*/
var a = 12; // 全局变量
var f = function () {
console.log(a) // undefined 存在变量提升的原因
var a = 100;
console.log(a) // 100 内部赋值为100
}
f()// 在代码执行之前,就有变量提升的这个阶段
console.log(a) // 12 全局的这个a和私有的a没有关系
// var b = 10;
var f2 = function(){
// console.log(b);
b = 200;
console.log(b)
}
f2(100);
console.log(b);
var f3 = function(c){
//
// let c = 100;
}
暂时性死区,如果let在函数式中进行声明的话,不会产生变量提升,比如可以在let声明变量之前 输出下该变量,输出结果会直接报错,这种现象就被称为暂时性死区
var d = 10;
var f4 = function(){
// console.log(d);//报错
// 暂时性死区; 在let和const之前 不能使用 他们声明的任何变量
let d = 100;
}
f4();
let的块状作用域 按照平常思路进行理解的话,e会输出12,g会输出13,但是通过结果可以发现g已经报错了,原因就是在于let把{}的区域变成了一个独立的块状作用域,只作用{}里面的输出,外测检测不到let在{}里边声明的变量,所以会导致报错
if(1<2){
var e = 12;
let g = 13;
}
console.log(e)//12
console.log(g);//报错