变量提升

2017-02-26  本文已影响0人  阿九是只大胖喵

首先先看一段代码:

    var num = 12;
    var obj = {
        name: 'derrick',
        age: 20
    };
    function fn() {
        console.log('勿忘初心,方得始终。');
    }
    console.log(fn); // 把整个函数的定义部分(函数本身)在控制台输出
    console.log(fn()); // 把当前函数执行的返回结果(return后面写的是啥,返回值就是啥,没有return,默认返回值是undefined)输出

其简略的过程图可如下表示


分析图.png

当浏览器加载HTML页面的时候,首先会提供一个供全局JavaScript代码执行的环境,称之为全局作用域(global/ window)。

预解释(变量提升):在当前的作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function的进行提前声明或者定义。
1) 理解声明和定义:
对于var num = 12;
声明(declaration):var num; -> 告诉浏览器在全局作用域中有一个num的变量了,如果一个变量只是申明了,但是没有赋值,默认值是undefined。
**定义(definition): **num = 12; -> 给变量进行赋值。

2) 对于带var关键字和带function关键字的,在预解释的时候操作还是不一样的
var: 在预解释的时候只是提前的声明。
**function: **在预解释的时候,提前的声明和定义都完成了。

  1. 预解释只发生在当前的作用域当中,例如:开始只对window下的预解释,只有函数执行的时候,才会对函数中的部分进行预解释。
    console.log(num); // undefined
    var num = 12;
    var obj = {
        name: 'derrick',
        age: 20
    };
    console.log(num); // 12
    fn(100, 200); // 可以在这里执行,因为预解释的时候,函数的声明和定义都已经完成了
    function fn(num1, num2) {
        var total = num1 + num2;
        console.log(total);
    }
分析图.png

JavaScript中内存的分类
栈内存: 用来提供一个供JavaScript代码执行的环境 -> 作用域(全局作用域,私有作用域)。
堆内存: 用来存储引用数据类型的值 -> 对象存储的是属性名和属性值, 函数存储的是代码字符串。

上一篇 下一篇

猜你喜欢

热点阅读