谈一谈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 交通频道 作文范文 动物园150字 嘟嘟的生活琐事 爱上一个无法永远在一起的人 师德活动月工作总结 作如是观造句 二十年后的家乡作文 阳台前的杨树 不做职场上的“奴隶”_职场励志 亲爱的、回到我身边来吧!我在乎,我离不开你 2015入党申请书范文(大一) 新奥数老师作文350字 Boysandgirls,let’swentt作文1700字 作文大全:读《送东阳马生序》有感500字 抚琴一曲穿千年,只因知音在彼岸 褪去“官衣”,脱钩改革 学生会女生部工作计划范文 质监分局党组织先进事迹 送韩十四被鲁王推递往济南府 明天就坠入运动会了作文300字 挖蚯蚓作文100字 二零一零年度工作总结 2015年迎七一演讲稿 ♂●い已颓废发表日志:阿姨,他们不能回家过年… 学校2012年个人年度总结(8) 非常时期中的彩 周记大全100字 初中初一作文750字:母亲很神气 这份沉甸甸的母爱 一个人旅行的日子 家是讲爱的地方 叶圣陶《游了三个湖》 关于舅舅的高中作文_,我想握住你的手 我爱你——中国 政教处期中总结发言 入党申请书a 他在我记忆深处_关于描写邻居爷爷的初中写人作文800字 打开高考作文思路的三把钥匙 小学五年级作文450字:螃蟹、天鹅、虾——三个好朋友 喜欢的颜色与性格关系分析 颜色喜好与性格特点 我的低碳生活作文1000字 许世友和酒的故事 虞美人.寄义妹钟玉珍以此勉之 黄莺儿 我爱您-母亲作文400字 捧起前尘,泪眼婆娑。 关于人性弱点的名句 读日书,享益生作文600字 加强农民素质培训力度,推进社会主义新农村建设 2013年小学新任班主任演讲稿 父亲的心中,永恒的女儿作文800字

Copyright © 2016 phpStudy |