4.2 Javascript之执行环境和作用域-阿里云开发者社区

开发者社区> 青衫无名> 正文

4.2 Javascript之执行环境和作用域

简介:
+关注继续查看
执行环境

每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。 
//书中说我们自己编写的代码无法访问这个对象 
//下面这个最外层的执行环境window对象是可以访问的呢??? 
web浏览器中,最外层的执行环境是window对象,因此所有的全局变量和函数都是作为window的属性或者方法创建的

作用域链

作用域链的用途是保证执行环境对有权限访问的变量和函数的有序访问 
作用域链的前端都是当前执行代码所在环境的变量对象 
如果这个环境是函数,则将其活动对象作为变量对象,活动对象在一开始的时候只包含了arguments对象,作用域链中的下一个变量对象来自于包含(外部)环境,再下一个变量对象则来自于下一个包含(外部)对象。。。一直延伸到全局执行环境(全局执行环境的变量对象始终是作用域链中的最后一个对象)

var globalColor = "globalColor";
function globalFunc(){
    //这里能访问函数里的变量和方法,但是不能访问innerFunc函数里的变量
    var globalColor = "globalFuncColor";
    function innerFunc(){
        //这里可以访问此函数里的所有变量和方法,还有外部的所有变量和方法
        var innerFuncColor = "innerFuncColor";
        var globalColor = "globalColor-innerFuncColor";
        innerFuncColor = globalColor;
        console.log(innerFuncColor)
    }
    console.log(globalColor)
    innerFunc();
}
globalFunc();
console.log(globalColor)
//globalFuncColor
//globalColor-innerFuncColor
//globalColor
//优先访问当前执行代码环境的变量对象
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
延长作用域链

执行环境的类型:全局和局部(函数)

function buildUrl(){
    var href = "test.com";
    with(location){
        var res = href + href;
    }
    return res;
}
buildUrl();
//width里的href代表的是location.href,所以结果里并没有"test.com"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
try{
    console.log(myTest)
}catch(ex){
    console.dir(ex.message);
};
// 对于捕获来说会创建一个新的变量对象,包含的是被抛出来的错误对象的声明
// 意思应该是新创建的执行环境下可以访问到抛出的错误对象
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
无块级作用域
for(var i = 0; i < 10; i++){
    console.log(i);
}
console.log("now i is: " + i);
//now i is 10
//变量i定义在for循环里面,循环结束后,还是可以访问到变量i,并没有销毁
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
变量查找
var color = "red";
function getColor(){
    return color;
}
console.log(getColor())
//调用getColor函数时,返回color变量的值,首先会在getColor函数的作用域内查找color变量
//没有找到变量,就会沿着作用域链继续向上层的作用域查找,找到就返回变量的值
//否则会一直向上查找至window全局作用域,如果全局作用域下查找不到,则就表明变量未声明
//优先返回局部作用域下的同名变量


原文发布时间:2018年03月15日

本文来源CSDN博客如需转载请紧急联系作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
python3中global 和 nonlocal 的作用域
python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 。
993 0
JavaScript异步精讲,让你更加明白Js的执行流程!
JavaScript异步精讲,让你更加明白Js的执行流程! 问题点 什么是单线程,和异步有什么关系 什么是 event-loop jQuery的Deferred Promise 的基本使用和原理 async/await(和 Promise的区别、联系) 一、什么是单线程,和异步有什么关系 单线程.
1830 0
JS闭包以及作用域初探
    以前看到的一个问题,很有意思: for (var i = 0; i < 5; i++) { setTimeout(function () { console.
691 0
深入理解JavaScript系列(14):作用域链(Scope Chain)
http://www.cnblogs.com/TomXu/archive/2012/01/18/2312463.html 前言 在第12章关于变量对象的描述中,我们已经知道一个执行上下文 的数据(变量、函数声明和函数的形参)作为属性存储在变量对象中。
853 0
Javascript操作DOM常用API总结
文本整理了javascript操作DOM的一些常用的api,根据其作用整理成为创建,修改,查询等多种类型的api,主要用于复习基础知识,加深对原生js的认识。
813 0
Linux c括号作用域【原创笔记】
大师指点后,所做的笔记,很感谢一起愿意研究技术的同事,以下不是本人原创,是他分析的成果#include #include struct lock_class_key { int ck; }; #define mutex_init() ...
708 0
JavaScript之作用域与变量
在javascript中声明变量时,我们经常使用的是 var 变量名=value; 例如: var =100; 可是你也许没有注意到这种声明变量的方式产生的变量是一个局部变量,而不是全局变量。
488 0
+关注
3598
文章
840
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载