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

 更新时间:2016年01月13日 09:28:36   作者:老贝V5  
这篇文章主要介绍了浅析JavaScript中的变量复制、参数传递和作用域链 的相关资料,需要的朋友可以参考下

今天在看书的过程中,又发现了自己目前对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.执行环境、变量对象、作用域链

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

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

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

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

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

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

相关文章

  • JS 获取span标签中的值的代码 支持ie与firefox

    JS 获取span标签中的值的代码 支持ie与firefox

    JS获取span标签中的值的代码,在实际应用中经常用的到的功能,原理很简单,大家可以拓展下。
    2009-08-08
  • 微信小程序wepy框架笔记小结

    微信小程序wepy框架笔记小结

    这篇文章主要介绍了微信小程序wepy框架笔记小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • JavaScript执行环境及作用域链实例分析

    JavaScript执行环境及作用域链实例分析

    这篇文章主要介绍了JavaScript执行环境及作用域链,结合实例形式分析了JavaScript执行环境及作用域链的相关概念、功能与使用技巧,需要的朋友可以参考下
    2018-08-08
  • 防止网站内容被小偷采集的js代码

    防止网站内容被小偷采集的js代码

    防止网站内容被小偷采集的js代码...
    2006-09-09
  • 微信小程序开发实现首页弹框活动引导功能

    微信小程序开发实现首页弹框活动引导功能

    自己x实现的一个比较简单微信弹窗功能,主要就是教会大家对微信弹窗的用法和理解,这篇文章主要给大家介绍了关于微信小程序如何实现首页弹框活动引导功能的相关资料,需要的朋友可以参考下
    2021-08-08
  • js中Array对象的常用遍历方法详解

    js中Array对象的常用遍历方法详解

    今天小编就为大家分享一篇关于js中Array对象的常用遍历方法详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • js中的reduce()函数讲解

    js中的reduce()函数讲解

    今天小编就为大家分享一篇关于js中的reduce()函数讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • JavaScript限定图片显示大小的方法

    JavaScript限定图片显示大小的方法

    这篇文章主要介绍了JavaScript限定图片显示大小的方法,涉及javascript针对图片的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • JavaScript实现数字格式化的示例详解

    JavaScript实现数字格式化的示例详解

    在处理数字时,为了提高可读性,我们通常会将整数部分的数字以千分位或百分位分隔,本文将详细介绍如何使用JavaScript来实现数字的千分位和百分位分隔,需要的可以参考下
    2024-04-04
  • JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解

    JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解

    这篇文章主要介绍了JavaScript实现的原生态兼容IE6可调可控滚动文字功能,简单说明了文字滚动的实现原理并结合具体实例形式给出了javascript文字滚动功能的具体实现代码,需要的朋友可以参考下
    2017-09-09

最新评论