js 变量提升与函数提升

    //Q:
    var c = 1
    function c(c){
        console.log(c)
        var c = 3
    }
    c(2)
    //A:
    报错
    
    //Ex:
    //1. 解释阶段(预处理)
    var c
    function c(c){
        console.log(c)
        var c = 3
    }
    //2. 执行阶段
    c=1
    c(2) //c is not a function

提升发生在脚本的解释阶段,提升时,先提升变量,再提升函数。剥离了提升的内容后,剩余的代码按顺序执行。

提升后的变量和函数放到相应的上下文栈( LIFO )中。

上下文分为三类:

1. 全局执行上下文,浏览器中为windows,nodejs中为global

对以下全局内进行预处理:

① 通过 var 声明的变量(代码尚未执行,不进行赋值操作,故而为undefined)

② 函数声明

③ 将window的地址赋值给this

前两项会添加到全局对象中,成为执行上下文

2. 函数执行上下文

当调用函数时,在函数执行前,对以下内容进行预处理:

① 形参赋值

② arguments赋值

③ var提升(代码尚未执行,不进行赋值操作,故而为undefined)

④ 内部声明的函数的提升

⑤ 将调用函数的对象的地址赋值给this

其中前四项会添加到函数执行上下文中

3. eval上下文

注: 执行上下文的创建阶段主要负责三件事:确定this---创建词法环境组件(LexicalEnvironment)---创建变量环境组件(VariableEnvironment)

 另可参考:

一篇文章看懂JS执行上下文

上下文区别于作用域:

作用域是静态的,在写代码是就已确定,而上下文随着函数的执行与结束而在上下文栈中创建与销毁。

原文地址:https://www.cnblogs.com/ShengunErshu/p/13815583.html