作用域:全局作用域和私有作用域
全局作用域
- 当你打开一个页面,浏览器就会形成全局作用域为代码执行提供环境,在全局作用域会生成一个全局的大对象叫window
- 全局作用域一般不销毁,直到页面关闭,作用域才会销毁 • 全局变量 在全局作用域下声明的变量就是全局变量
let a = 12;
var b = 13;
function fn(){}
// 1、用var和function声明的变量会在全局作用域下声明一个变量,而且也会给window增加属性,属性名是变量名,属性值是变量名存储的值(let不支持)
// var s = 12;
// function fn(){}
// console.log(window.s)
// console.log(window.fn)
// let a = 12;
// console.log(window.a) // undefined
// 2、var和function可以重复创建同一个变量名(let不可以)
// var a = 12;
// var a = 13;
// console.log(a)
let a = 12; // 报错 SyntaxError(语法错误)
let a = 13;
// function fn(){
// var e = 12
// }
//3、 let不存在变量提升
// 4、let会形成块级作用域
私有作用域
- 全局作用域生成之后才会有私有作用域,私有作用域是属于全局作用域的 函数执行会形成一个私有栈内存(私有作用域)【为代码执行提供环境】
- 函数作用域中定义的变量,只能在函数中调用,外界无法访问。
没有块级作用域导致了if或for这样的逻辑语句中定义的变量可以被外界访问,
因此ES6中新增了let和const命令来进行块级作用域的声明。
function fn(){
/* 函数定义:
1、首先开辟一个堆内存生成一个16进制的空间地址
2、把函数体里的代码以字符串的格式存进去
3、把16进制的地址赋值给函数名
*/
}
fn();
/*
函数执行:
1、首先开辟一个私有作用域(为代码执行提供环境)
2、形参赋值
3、变量提升
4、代码从上往下执行
5、作用域是否被销毁
*/
作用域链 变量的查找机制
- 上级作用域 函数在哪里定义的,那么该函数执行形成的作用的上级作用域就是谁
- 了解了上级作用域, 就比较容易查找变量对应的值