谈一谈js中的执行环境及作用域


最近在面试时被问到了对作用域链的理解,感觉当时回答的不是很好,今天就来说说js中的作用域链吧。

首先来说说js中的执行环境,所谓执行环境(有时也称环境)它是JavaScript中最为重要的一个概念。执行环境定义了变量或函数有权访问的其他数据 ,决定了它们各自的行为。而每个执行环境都有一个与之相关的变量对象,环境中定义的所有变量和函数都保存在这个对象中。

理解了执行环境,现在就看看什么是作用域链吧。每个函数都有自己的执行环境,当代码在执行环境中执行时,就会创建变量对象的作用域链。作用域链保证了对执行环境有权访问所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在的环境的变量对象,如果环境是一个函数,那么它的变量对象就是该函数的活动对象。作用域链的下一个变量对象来自包含(外部)环境,再下一个变量对象来自下一个包含环境。这样一直延续到全局执行环境,记住,全局执行环境的变量对象永远是作用域中的最后一个对象。

请看下面的例子:

var scope="global";
function foo(){
  console.log(scope);
}  
foo();

在这个例子中,函数foo()的作用域链包含了两个对象,一个是它自身对象,另一个是全局环境中的变量对象。因为我们可以在这个作用域链中找的scope,所以可以在函数内部里访问到它。

在看一个例子:

var color = "blue";
function changeColor(){
  var anoterColor = "red";
  function swapColor(){
    var tempColor = anoterColor;
    anoterColor = color;
    color = tempColor;
    console.log(color);
  }
  swapColor();
}
changeColor();

在这个例子中,有三个执行环境:全局环境、changeColor()的局部环境和swapColor()局部环境。我们来看看这个例子的作用域链是怎样的吧。

图中的矩形表示特定的执行环境。我们可以看到变量tempColor只能在swapColor()环境中访问到,而在changeColor()的局部环境还是全局环境中都无法访问到它。因此我们可以得到一个结论:内部的环境可以通过作用域链访问所有的外部环境,但外部的环境无法访问内部的环境中的任何变量和函数。每个环境都可以向上搜索作用域链,以查询变量和函数名;但是任何环境都不能通过向下搜索作用域而进入另一个执行环境。

作用域中我还想说说的是:js没有块级作用域

为什么说js没有块级作用域呢?我们来看下面的代码:

if(true){
 var color = "blue"; 
}
alert(color);  //"blue"
 

咦,为什么color在if语句执行完毕后被销毁呢?哈哈,如果在C、C++或Java中,color确实会被销毁,但在JavaScript中,if语句中的变量声明会将变量添加到当前的执行环境中(在这里是全局环境)中。特别地,在for语句时要牢记这一差异,例如:

for(var i = 0;i< 10; i++){
doSomething(i);
}
alert(i);    //10

记住:在JavaScript中,由for语句创建的变量i即使在for循环执行结束之后,也依然会存在于循环外部的执行环境中。

以上就是本文的全部内容,希望对大家的学习有所帮助。



相关阅读:
使用getBoundingClientRect方法实现简洁的sticky组件的方法
asp.net 图标提取以及图标转换的实例代码
Android App开发中Gradle构建过程的配置方法
jQuery中阻止冒泡事件的方法介绍
HTML5几个设计和修改的页面范例分享
.NET运行界面上,实现随意拖动控件的方法
用PHP提取中英文词语以及数字的首字母的方法介绍
Win7复制文件时提示错误代码0X80070057的解决方法
javascript实现动态加载CSS
js实现的黑背景灰色二级导航菜单效果代码
PHP页面中文乱码分析
PHP学习笔记(一) 简单了解PHP
Jquery响应回车键直接提交表单操作代码
MFC程序对文件的处理方法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 创建新农村的五大关键 “标题党”的快乐岁月 医生入党积极分子12月思想汇报 《钢铁是怎样炼成的》有感作文350字 小学教师工作计划范文 道路安全年终工作总结 成功给我带来了快乐作文 勿忘国耻,振兴中华--读《中国的屈辱历史》有感 小学二年级作文300字:观看日食 朱砂痣.随心疼 舍弃世界又何妨、因为你才是我的全世界 我想结婚了,随便找个女人 关于青春,关于年少的爱情 军人“八一”演讲稿:增强责任感 描写兄弟情深的句子 对云的思恋 《拥抱亲情》主题班会 激情亚运 快乐亚运 好久都没有 秋风下,有棵树 奇妙的树作文200字 大专自我鉴定800字 秋天的气息作文600字 学生会纪检部副部长竞选稿 新课程骨干教师培训班结业典礼讲话稿 创业如何快速进入状态 送你一勺西湖水作文1500字 论语读后感之三十四 快乐的今天 城管局灯光环境管理中心党委工作总结 迷雾里,请闭上你的眼睛 支持赛尔号作文400字 今生,为你守候 党员干部违反“双拆”决定处理办法 小学生除夕英语作文:My Spring Festival 为落叶喝彩作文650字 县财政局工作总结及计划 心中若有一个信仰 黑猫警长抓坏蛋(看图作文)作文600字 宝贝,原来你也在这里! 2016年战士半年工作总结 第一天上学作文150字 大三学生个人自我鉴定范文大全 神奇的塑料尺200字 2011年党办公室工作总结 父亲病床前,恨自己无力尽孝! 国防意识与爱国主义 当初的回忆——断翼天使 中心小学2012-2013年秋上学期少先队工作总结 娜子

Copyright © 2016 phpStudy |