资讯专栏INFORMATION COLUMN

js的作用域、作用域链

masturbator / 637人阅读

摘要:作用域所谓作用域,就是变量或者是函数能作用的范围。常见的经典例子解决办法作用域链变量随着作用长辈函数一级一级往上搜索,直到找到为止,找不到就报错,这个过程就是作用域链起的作用。

作用域
所谓作用域,就是变量或者是函数能作用的范围。

那么JavaScript里有什么作用域呢?

1、全局作用域
除了函数中定义的变量之外,都是全局作用域。

举个栗子:

var a = 10;
function bar(){
    console.log(a);
}
bar();//10

以上的a就是全局变量,到处可以访问a。
然鹅,

var a = 10;
function bar(){
    console.log(a);
    var a = 20;
}
bar();//undefined

什么鬼?undefined?
是的,你没看错。因为先搜索函数的变量看是否存在a,存在,又由于a被预解析(变量提升),提升的a绑定了这里的a作用域,所以结果就是undefined。

2、局部作用域
函数里用var声明的变量。

举个栗子:

var a = 10;
function bar(){
   var a  = 20;
    console.log(a);
}
bar();//20
3、没有块级作用域(至ES5),ES6中有块级作用域
ES6之前,除了函数之外的块都不具备块级作用域。

常见的经典例子:

for(var i=0;i<4;i++){
    setTimeout(function(){
        console.log(i);
    },200);
}
//4 4 4 4

解决办法:

for(var i=0;i<4;i++){
    (function(j){
            setTimeout(function(){
        console.log(j);
    },200);
    })(i)
}
//0 1 2 3
作用域链
变量随着作用长辈函数一级一级往上搜索,直到找到为止,找不到就报错,这个过程就是作用域链起的作用。
var num = 30;
function f1(){
    var num  = 20;
    function f2(){
        var num = 10;
        function f3(){
            var num = 5;
            console.log(num);
        }
        f3();
    }
   f2();
}
f1();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94664.html

相关文章

  • 形象化模拟作用链,深入理解js作用、闭包

    摘要:至此作用域链创建完毕。好了,通过深入理解作用域链,我们能跟好的理解的运行机制和闭包的原理。 前言 理解javascript中的作用域和作用域链对我们理解js这们语言。这次想深入的聊下关于js执行的内部机制,主要讨论下,作用域,作用域链,闭包的概念。为了更好的理解这些东西,我模拟了当一个函数执行时,js引擎做了哪些事情--那些我们看不见的动作。 关键词: 执行环境 作用域 作用域链 变...

    txgcwm 评论0 收藏0
  • 深入学习js之——作用

    摘要:开篇作用域是每种计算机语言最重要的基础之一,因此要想深入的学习作用域和作用域链就是个绕不开的话题。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。这时候执行上下文的作用域链,我们命名为至此,作用域链创建完毕。 开篇 作用域是每种计算机语言最重要的基础之一,因此要想深入的学习JavaScript,作用域和作用域链就是个绕不开的话题。 在《深入学习js之—-执行上下文栈》中我们提到...

    lemanli 评论0 收藏0
  • [学习笔记] JavaScript 作用

    摘要:全局执行环境的变量对象始终是作用域链中的最后一个变量对象。综上,每个函数对应一个执行环境,每个执行环境对应一个变量对象,而多个变量对象构成了作用域链,如果当前执行环境是函数,那么其活动对象在作用域链的前端。 1.几个概念 先说几个概念:函数、执行环境、变量对象、作用域链、活动对象。这几个东东之间有什么关系呢,往下看~ 函数 函数大家都知道,我想说的是,js中,在函数内部有两个特殊...

    ?xiaoxiao, 评论0 收藏0
  • JS 执行上下文栈 / 作用

    摘要:每一个执行上下文可以访问的对象包括自身的作用域和父执行上下文的作用域和父父执行上下文作用域直到全局作用域,这就产生了作用域链。语句结束后,作用域链恢复正常。 0、自己理解 代码执行或函数调用生成执行上下文(只有当前执行上下文有执行权),该执行上下文内只能访问当前执行上下文的变量、函数和上一级执行上下文中的变量、函数,激活下一个执行上下文的时候执行权转移到新的执行上下文,形成执行上下文栈...

    yunhao 评论0 收藏0
  • 还是不明白JavaScript - 执行环境、作用作用链、闭包吗?

    摘要:所以,全局执行环境的变量对象始终都是作用域链中的最后一个对象。讲到这里,可能你已经对执行环境执行环境对象变量对象作用域作用域链的理解已经他们之间的关系有了一个较清晰的认识。 JavaScript中的执行环境、作用域、作用域链、闭包一直是一个非常有意思的话题,很多博主和大神都分享过相关的文章。这些知识点不仅比较抽象,不易理解,更重要的是与这些知识点相关的问题在面试中高频出现。之前我也看过...

    jlanglang 评论0 收藏0
  • JavaScript 作用学习笔记

    摘要:每一个运行期上下文都和一个作用域链关联。这个对象将被推入作用域链的头部,这意味着函数的所有局部变量现在处于第二个作用域链对象中,因此访问代价更高了。在代码块内部,函数的所有局部变量将会被放在第二个作用域链对象中。 参考: Javascript作用域原理 理解 JavaScript 作用域和作用域链 JavaScript 作用域 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数...

    赵连江 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<