资讯专栏INFORMATION COLUMN

JavaScript基础---执行环境与作用域链

Jeffrrey / 2480人阅读

摘要:一执行环境与作用域链什么是执行环境执行环境定义了变量和函数的访问权限,决定了他们的各自行为。

一、执行环境与作用域链 1.什么是执行环境

执行环境定义了变量和函数的访问权限,决定了他们的各自行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有对象和函数都保存在这个对象里。

全局环境是最外围的一个执行环境,在Web浏览器里全局执行环境被认为是window对象

某个执行环境中所有代码执行完毕后该环境被销毁

每个函数都自己的执行环境,当执行流进入一个函数时,函数的执行环境就会被压入环境栈中,函数执行完将环境弹出栈,把控制权返回之前的执行环境

2.作用域链及其作用

代码在某个环境中执行时,会创建变量对象的一个作用域链

通过作用域链保证对执行环境有权访问的所有变量和函数的有序访问

作用域链的前端是当前执行的代码所在环境的变量对象

例:

var name1 = "11111";
function changeName(){
    var name2 = "22222";
    function swapName(){
        var tmpName = name1;
        name1 = name2;
        name2 = tmpName;
    }
    swapName();
}
changeName();

执行环境栈如下:从栈顶向栈底搜索变量

上述代码中共有三个执行环境:全局环境、changeName局部环境和swapName局部环境;其中全局环境变量对象中有name1变量和changeName函数,changeName环境变量对象中有name2变量和swapName函数,swapName环境变量对象中有tmpName变量;全局环境和changeName局部环境都不能访问tmpName变量

二、块级作用域

ES6之前只有全局作用域和函数作用域

for(var i = 0; i < 5; i++){
    console.log(i);
}
console.log(i); //5

这里的i是在全局执行环境中的,就算for循环执行完全局执行环境中的变量也不会被销毁

function getSum(){
    var sum = 0;
    for(var i = 0; i < 5; i++){
        sum += i;
        console.log(sum);
    }
    console.log(i); //5
}
console.log(sum)//报错

上述代码中有两个执行环境,其中getSum执行环境中有变量sum、i,所以getSum可以访问到sum和i,当执行完getSum后该执行环境被销毁,全局环境中访问不到sum变量

function getSum(){
    sum = 0;
    for(var i = 0; i < 5; i++){
        sum += i;
        console.log(sum);
    }
    console.log(i); //5
}
console.log(sum)//10

上述代码中sum变量没有用var声明(不推荐这种做法),此时sum属于全局执行环境中,所以就算函数执行完毕sum依然存在

参考文章:JavaScript高级程序设计

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

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

相关文章

  • 前端基础进阶(四):详细图解作用域链闭包

    摘要:之前一篇文章我们详细说明了变量对象,而这里,我们将详细说明作用域链。而的作用域链,则同时包含了这三个变量对象,所以的执行上下文可如下表示。下图展示了闭包的作用域链。其中为当前的函数调用栈,为当前正在被执行的函数的作用域链,为当前的局部变量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初学JavaScrip...

    aikin 评论0 收藏0
  • JavaScript基础系列---闭包及其应用

    摘要:所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。所以本文中将以维基百科中的定义为准即在计算机科学中,闭包,又称词法闭包或函数闭包,是引用了自由变量的函数。 闭包(closure)是JavaScript中一个神秘的概念,许多人都对它难以理解,我也一直处于似懂非懂的状态,前几天深入了解了一下执行环境以及作用域链,可戳查看详情,而闭包与作用域及作用域链的关系密不可分,所...

    leoperfect 评论0 收藏0
  • JavaScript基础系列---执行环境作用域链

    摘要:延长作用域链下面两种语句可以在作用域链的前端临时增加一个变量对象以延长作用域链, 问题 今天看笔记发现自己之前记了一个关于同名标识符优先级的内容,具体是下面这样的: 形参优先级高于当前函数名,低于内部函数名 形参优先级高于arguments 形参优先级高于只声明却未赋值的局部变量,但是低于声明且赋值的局部变量 函数和变量都会声明提升,函数名和变量名同名时,函数名的优先级要高。执行代...

    J4ck_Chan 评论0 收藏0
  • JavaScript闭包(三)

    摘要:目录执行环境与作用域链立即执行函数闭包知识点什么是闭包使用闭包的意义与注意点闭包的具体应用小结这是基本语法的函数部分的第篇文章,主要讲述了中比较重要的知识点闭包在讲闭包之前,在上一篇函数二的基础上,进一步深化执行环境和作用域链的知识点,并补 目录 1.执行环境与作用域链 2. 立即执行函数 3. 闭包知识点 3.1 什么是闭包 3.2 使用闭包的意义与注意点 3.3 闭包的具体应用 4...

    Anonymous1 评论0 收藏0
  • 理解javaScript变量、作用域链

    摘要:作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。当前的执行环境就是作用域的最前端,标识符解析是沿着作用域链最前端向后回溯,直到找到标志符当某个函数被调用时,会创建一个执行环境及相应的作用域链。 变量由于JavaScript变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已。变量分为基础类型值和引用类型值;基本类型值指的是简单的数据段(Undefi...

    KevinYan 评论0 收藏0

发表评论

0条评论

Jeffrrey

|高级讲师

TA的文章

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