浅析JavaScript中的变量复制、参数传递和作用域链


Posted in Javascript onJanuary 13, 2016

今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习。今天学习笔记主要有这样几个关键字:变量、参数传递、执行环境、变量对象、作用域链。

1.变量

变量需要注意的有两点:变量声明和复制变量值。

变量声明肯定大家都很熟悉,在JS中我们都是通过 var 关键字进行变量声明的。JS中规定,通过var声明的变量会被添加到最近的环境中,如果声明并且初始化一个变量没有用到var关键字,这个变量会被添加到全局环境中。

关于复制变量值,因为变量的类型不同复制的过程也不同。如果变量是一个基本类型的变量的话,复制变量值时会给新复制出的变量分配新的空间,两个变量值互不影响;如果变量是一个引用类型的话,复制的操作其实是让两个变量指向了同一处内存空间,修改其中一个,另一个也会跟着改变。《Javascript 高级程序设计》中的图例其实很形象

2.参数传递

JavaScript中的参数传递全部是按照值传递的。基本类型做参数一般都不会有什么困惑,如果引用类型做了参数,类似下面这个例子:

function setName(obj){
obj.name = "tom";
}
var person = new Object();
setName(person);
alert(person.name);//显示tom

这个例子中我们在setName中修改了变量的内容,在函数外也生效了。刚开始我也以为程序执行应该会弹出 undefined 或者报错,但是却弹出了在函数的作用域中修改的值。分析了一下参数传递的整个过程,这个疑惑就解决了。在参数传递的过程中,有很重要的一步:变量值复制。我们在调用函数时其实进行了 obj=person 这样一步操作,所以根据上面提到的引用类型变量值复制的特点,当我们修改obj时,同时也就修改了person的值。所以JS参数传递的方式是值传递,并且只能是值传递。

3.执行环境、变量对象、作用域链

我对执行环境、执行环境的理解有点类似与类和对象:

执行环境中定义了变量、函数和函数可以访问到的其他数据,而当这个执行环境被激活时,就会根据这个执行环境创建出一个变量对象提供给解析器使用。执行环境就好比是类,变量对象就对应是对象。

当一个执行环境激活时,它就会被推入一个栈的栈顶中执行,当它执行完毕,会将它移出栈,执行在它之前进入栈的环境,以此类推。

而作用域链相当于一个存放变量对象的栈,越早被激活的执行环境创建出的变量对象越在下面,当前激活的执行环境的变量对象位于栈顶。如果当前执行环境执行完毕,那么就需要将栈顶的变量对象(对应执行环境)从栈顶移出。

而执行环境在执行时,解析器需要访问变量等数据都是从作用域顶端开始查找,也就是从当前执行环境对应的变量对象开始查找,如果查找不到,则往下进入外层执行环境对应的变量对象中查找,一直持续到找到需要的对象或找到全局环境的变量对象为止。所以这种查找方式也就说明了太多定义在全局环境中的变量比较影响程序的性能。

今天学习的东西主要是概念性质的,而且比较抽象。但是这部分对于后面所有的知识都是基础,像是之后的闭包啊,继承啊,原型啊都要对这部分内容有很好的理解才能学的更明白透彻,所以这部分内容应该反复学习,要相信温故而知新,古人诚不欺我也(。・∀・)ノ゙

Javascript 相关文章推荐
javascript英文日期(有时间)选择器
May 02 Javascript
javascript import css实例代码
Jul 18 Javascript
用Jquery选择器计算table中的某一列某一行的合计
Aug 13 Javascript
jQuery插件zepto.js简单实现tab切换
Jun 16 Javascript
requireJS使用指南
Apr 27 Javascript
AngularJs  unit-testing(单元测试)详解
Sep 02 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
Nov 25 Javascript
微信小程序开发图片拖拽实例详解
May 05 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
Jul 19 Javascript
浅谈node的事件机制
Oct 09 Javascript
vue-router路由懒加载和权限控制详解
Dec 13 Javascript
使用Vue实现移动端左滑删除效果附源码
May 16 Javascript
Jquery uploadify上传插件使用详解
Jan 13 #Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
Jan 13 #Javascript
jquery对复选框(checkbox)的操作汇总
Jan 13 #Javascript
分享javascript计算时间差的示例代码
Mar 19 #Javascript
学习JavaScript设计模式之代理模式
Jan 12 #Javascript
基于JavaScript实现TAB标签效果
Jan 12 #Javascript
JavaScript实现瀑布流布局
Jun 28 #Javascript
You might like
PHP 一个页面执行时间类代码
2010/03/05 PHP
paypal即时到账php实现代码
2010/11/28 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
Smarty模板配置实例简析
2019/07/20 PHP
Javascript将string类型转换int类型
2010/12/09 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
2015/03/28 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
JavaScript实现点击按钮字体放大、缩小
2016/02/29 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
动态Axios的配置步骤详解
2018/01/12 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
vue组件之间通信方式实例总结【8种方式】
2019/02/22 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
Python高效编程技巧
2013/01/07 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
amazeui页面分析之登录页面的示例代码
2020/08/25 HTML / CSS
WiFi云数码相框:Nixplay
2018/07/05 全球购物
Bally巴利中国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/10/09 全球购物
西班牙家用电器和电子产品购物网站:Mi Electro
2019/02/25 全球购物
百度软件工程师职位
2013/02/14 面试题
简历的个人自我评价范文
2014/01/03 职场文书
热门专业求职信
2014/05/24 职场文书
会议室标语
2014/06/21 职场文书
生日宴会家属答谢词
2015/09/29 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL