js 作用域链

1、JavaScript的作用域链

首先看下下面这段代码:

var rain = 1;

function rainman(){

    var man = 2;

    function inner(){

        var innerVar = 4;

        alert(rain);

    }

    inner();    //调用inner函数

}

rainman();    //调用rainman函数

观察alert(rain);这句代码。JavaScript首先在inner函数中查找是否定义了变量rain,如果定义了则使用inner函数中的rain变量;如果inner函数中没有定义rain变量,JavaScript则会继续在rainman函数中查找是否定义了rain变量,在这段代码中rainman函数体内没有定义rain变量,则JavaScript引擎会继续向上(全局对象)查找是否定义了rain;在全局对象中我们定义了rain = 1,因此最终结果会弹出'1'。

作用域链:JavaScript需要查询一个变量x时,首先会查找作用域链的第一个对象,如果以第一个对象没有定义x变量,JavaScript会继续查找有没有定义x变量,如果第二个对象没有定义则会继续查找,以此类推。

上面的代码涉及到了三个作用域链对象,依次是:inner、rainman、window。


2、函数体内部,局部变量的优先级比同名的全局变量高。

var rain = 1;    //定义全局变量 rain

function check(){

    var rain = 100;    //定义局部变量rain

    alert( rain );      //这里会弹出 100

}

check();

alert( rain );    //这里会弹出1


3、未使用var关键字定义的变量都是全局变量。全局变量都是window对象的属性。



理解:内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。 这些环境之间的联系是线性的、有次序的。

但是有一类可以访问到内部的变量,这种方式被称作闭包。一个局部变量会在函数执行开始时候被初始化,函数结束时销毁,但是如果在局部变量外部引用到了函数内部的变量,此时这个函数就不会被销毁了,这也是为什么闭包内部的变量一直都存在在内存的原因。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论...
    宁骥阅读 2,688评论 0 1
  • 函数声明和函数表达式有什么区别? 1.声明的函数foo将会在执行前提升,因此foo在函数上下文都是可以被调用的,即...
    小囧兔阅读 2,350评论 0 1
  • 大家好,我是IT修真院成都分院第三期的学员,一枚正直纯洁善良的web程序员今天给大家分享一下,修真院官网js任务4...
    取老夫的草莓蛋糕来阅读 1,679评论 0 2
  • 给出两个不同的例子: 范例1: 分析上面代码:全局作用域中定义了变量x,function foo()以及funct...
    DeeJay_Y阅读 2,656评论 0 1
  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 5,623评论 0 6

友情链接更多精彩内容