1、变量提升:在当前上下文中(全局/私有/块级),JS代码自上而下执行之前,
浏览器会提前处理一些事情(可以理解为词法解析的一个环节,词法解析一定
发生在代码执行之前):会把当前上下文中所有带VAR/FUNCTION关键字的进
行提前的声明或者定义
声明declare:var a
定义defined: a = 10
带 var 的只会提前的声明
带 function 会提前声明加定义
console.log(a); // undefined
var a = 12; // 不需要再声明a了,只需要赋值就行
a = 13;
console.log(a); // 13
func();
function func() {
var a = 12;
console.log('OK');
}
// 真实项目中建议使用函数表达式创建函数,因为这样在变量提升阶段
// 只会声明函数不会赋值
// func(); // Uncaught TypeError: func is not a function
var func = function () {
console.log('OK')
};
// func(); // 正确执行
匿名函数“具名化”
var func = function AAA() {
/**
把原本作为值的函数表达式匿名函数“具名化”(虽然说是起了名字,
但是这个名字不能在外面访问,也就是不会在当前的上下文中创建
这个名字)
*/
/**
当函数执行时,在形成的私有上下文中,会把这个具名化的名字作为私有
上下文中的变量(值就是这个函数)来进行处理
*/
console.log('OK');
}
AAA(); // Uncaught ReferenceError: AAA is not defined
console.log(a); // ReferenceError: a is not define
a = 13;
console.log(a)
console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization
let a = 12;
a = 13;
console.log(a);
2、基于 var 或者function 在 全局上下文 中声明的变量(全局变量)会 “映射”到
GO(全局对象window)上一份,并且成为他的属性,而且接下来是一个修改,
另外一个也会跟着修改