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博客如需转载请紧急联系作者

相关文章
|
1月前
|
JavaScript 前端开发
js的作用域作用域链
【10月更文挑战第29天】理解JavaScript的作用域和作用域链对于正确理解变量的访问和生命周期、避免变量命名冲突以及编写高质量的JavaScript代码都具有重要意义。在实际开发中,需要合理地利用作用域和作用域链来组织代码结构,提高代码的可读性和可维护性。
|
4月前
|
JavaScript 前端开发
浅谈js作用域
浅谈js作用域
37 0
|
1月前
|
自然语言处理 JavaScript 前端开发
[JS]作用域的“生产者”——词法作用域
本文介绍了JavaScript中的作用域模型与作用域,包括词法作用域和动态作用域的区别,以及全局作用域、函数作用域和块级作用域的特点。通过具体示例详细解析了变量提升、块级作用域中的暂时性死区等问题,并探讨了如何在循环中使用`var`和`let`的不同效果。最后,介绍了两种可以“欺骗”词法作用域的方法:`eval(str)`和`with(obj)`。文章结合了多位博主的总结,帮助读者更快速、便捷地掌握这些知识点。
36 2
[JS]作用域的“生产者”——词法作用域
|
1月前
|
前端开发 JavaScript 数据处理
CSS 变量的作用域和 JavaScript 变量的作用域有什么不同?
【10月更文挑战第28天】CSS变量和JavaScript变量虽然都有各自的作用域概念,但由于它们所属的语言和应用场景不同,其作用域的定义、范围、覆盖规则以及与其他语言特性的交互方式等方面都存在明显的差异。理解这些差异有助于更好地在Web开发中分别运用它们来实现预期的页面效果和功能逻辑。
|
1月前
|
JavaScript 前端开发
如何在 JavaScript 中实现块级作用域?
【10月更文挑战第29天】通过使用 `let`、`const` 关键字、立即执行函数表达式以及模块模式等方法,可以在JavaScript中有效地实现块级作用域,更好地控制变量的生命周期和访问权限,提高代码的可维护性和可读性。
|
1月前
|
JavaScript 前端开发
javascript的作用域
【10月更文挑战第19天javascript的作用域
|
2月前
|
JavaScript 前端开发
JavaScript 作用域
JavaScript 作用域是指程序中可访问的变量、对象和函数的集合。它分为函数作用域和局部作用域。函数作用域内的变量仅在函数内部可见,而全局作用域的变量在整个网页中均可访问。局部变量在函数执行完毕后会被销毁,而全局变量则在整个脚本生命周期中都存在。未使用 `var` 关键字声明的变量默认为全局变量。
|
2月前
|
JavaScript 前端开发
js作用域
js作用域
19 1
|
3月前
|
JavaScript 前端开发
js 变量作用域与解构赋值| 22
js 变量作用域与解构赋值| 22
|
3月前
|
JavaScript 前端开发
JavaScript基础知识-作用域(action scope)
关于JavaScript基础知识中作用域的介绍。
46 1
JavaScript基础知识-作用域(action scope)