美文网首页
词法作用域和变量提升

词法作用域和变量提升

作者: 芒果加奶 | 来源:发表于2017-09-20 23:09 被阅读0次

    词法作用域

    一、作用域

    定义:就是作用范围
    作用域说明的是一个变量可以在什么地方被使用,什么地方不能被使用。

    1.块级作用域

    JavaScript中没有块级作用域概念
    所以只要声明过的变量,在访问的时候就不会报错。
    在JavaScript中作用域规则:

    • 函数允许访问函数外的数据
    • 整个代码结构中只有函数可以限定作用域
    • 作用域规则首先使用特生规则分析
    • 如果当前作用规则中没有名字了,就不考虑外面的名字。

    二、变量提升

    fun();
    function(){
    alert(123);
    }
    //实际语法中没有报错,因为JavaScript并非在运行简单的逐句解析执行。

    JavaScript预解析

    JavaScript引擎在对JavaScript进行解释执行之前,会对JavaScript代码进行预解析阶段,会以关键字varfunction开头的语句块提前进行处理。
    当变量和函数声明的处在作用域比较靠后的位置的时候,变量和函数的声明会被提升到作用域的开头。
    声明、定义、初始化的区别:

    • 声明:告诉解析器有这个变量存在,这个行为是不分配内存空间的,在JavaScript中,声明一个变量的操作为var a;
    • 定义:在变量分配内存空间,在C语言中,一般生命就包含了定义,比如:int a;但在JavaScript中,var a 这种形式只是声明。
    • 初始化:在定义变量之后,系统为变量分配的空间内存储的值是不确定的,所以需要对这个空间进行初始化,以确保程序的安全性和确定性。
    • 赋值:赋值就是变量在分配空间之后的某个时间里,对变量的值进行刷新操作(修改存储空间内的数据)
      所以,本文提到的提升,是声明的提升。
    预解析是分作用域的

    声明变量并不是将所有的声明都提升到window对象下面,提升原则是提升到变量运行的环境(作用域)中。

    函数表达式并不会被提升
        func();
        var func = function(){
            alert("我被提升了");
        }
        //这里会直接宝座找不到函数,原因是var fun = function(){},这种函数表达式,并不会被提升,只是简单了对变量进行了处理。
    

    三、作用域链

    什么是作用域链?只有函数可以制造作用域结构,只要是代码,就至少有一个作用域,即全局作用域。
    凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域就又可以诞生一个作用域。将这样的作用域列出来,就会出现一个结构,函数内指向函数外的链式结构,称为作用域链。

    相关文章

      网友评论

          本文标题:词法作用域和变量提升

          本文链接:https://www.haomeiwen.com/subject/nkuasxtx.html