6、变量提升的处理机制(1)

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)上一份,并且成为他的属性,而且接下来是一个修改,
另外一个也会跟着修改

你可能感兴趣的:(6、变量提升的处理机制(1))