浅析JavaScript中的变量复制、参数传递和作用域链
2016-01-13 00:00
731 查看
今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习。今天学习笔记主要有这样几个关键字:变量、参数传递、执行环境、变量对象、作用域链。
1.变量
变量需要注意的有两点:变量声明和复制变量值。
变量声明肯定大家都很熟悉,在JS中我们都是通过 var 关键字进行变量声明的。JS中规定,通过var声明的变量会被添加到最近的环境中,如果声明并且初始化一个变量没有用到var关键字,这个变量会被添加到全局环境中。
关于复制变量值,因为变量的类型不同复制的过程也不同。如果变量是一个基本类型的变量的话,复制变量值时会给新复制出的变量分配新的空间,两个变量值互不影响;如果变量是一个引用类型的话,复制的操作其实是让两个变量指向了同一处内存空间,修改其中一个,另一个也会跟着改变。《Javascript 高级程序设计》中的图例其实很形象
2.参数传递
JavaScript中的参数传递全部是按照值传递的。基本类型做参数一般都不会有什么困惑,如果引用类型做了参数,类似下面这个例子:
这个例子中我们在setName中修改了变量的内容,在函数外也生效了。刚开始我也以为程序执行应该会弹出 undefined 或者报错,但是却弹出了在函数的作用域中修改的值。分析了一下参数传递的整个过程,这个疑惑就解决了。在参数传递的过程中,有很重要的一步:变量值复制。我们在调用函数时其实进行了 obj=person 这样一步操作,所以根据上面提到的引用类型变量值复制的特点,当我们修改obj时,同时也就修改了person的值。所以JS参数传递的方式是值传递,并且只能是值传递。
3.执行环境、变量对象、作用域链
我对执行环境、执行环境的理解有点类似与类和对象:
执行环境中定义了变量、函数和函数可以访问到的其他数据,而当这个执行环境被激活时,就会根据这个执行环境创建出一个变量对象提供给解析器使用。执行环境就好比是类,变量对象就对应是对象。
当一个执行环境激活时,它就会被推入一个栈的栈顶中执行,当它执行完毕,会将它移出栈,执行在它之前进入栈的环境,以此类推。
而作用域链相当于一个存放变量对象的栈,越早被激活的执行环境创建出的变量对象越在下面,当前激活的执行环境的变量对象位于栈顶。如果当前执行环境执行完毕,那么就需要将栈顶的变量对象(对应执行环境)从栈顶移出。
而执行环境在执行时,解析器需要访问变量等数据都是从作用域顶端开始查找,也就是从当前执行环境对应的变量对象开始查找,如果查找不到,则往下进入外层执行环境对应的变量对象中查找,一直持续到找到需要的对象或找到全局环境的变量对象为止。所以这种查找方式也就说明了太多定义在全局环境中的变量比较影响程序的性能。
今天学习的东西主要是概念性质的,而且比较抽象。但是这部分对于后面所有的知识都是基础,像是之后的闭包啊,继承啊,原型啊都要对这部分内容有很好的理解才能学的更明白透彻,所以这部分内容应该反复学习,要相信温故而知新,古人诚不欺我也(。・∀・)ノ゙
JS 参数传递的实际应用代码分析
js 函数的执行环境和作用域链的深入解析
javascript 嵌套的函数(作用域链)
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
JavaScript中的作用域链和闭包
深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解
js setTimeout 参数传递使用介绍
Javascript获取HTML静态页面参数传递值示例
深入理解JavaScript高级之词法作用域和作用域链
JS的参数传递示例介绍
javascript函数中参数传递问题示例探讨
四种参数传递的形式――URL,超链接,js,form表单
JavaScript函数的调用以及参数传递
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 Base64编码和解码,实现URL参数传递。JS 参数传递的实际应用代码分析
js 函数的执行环境和作用域链的深入解析
javascript 嵌套的函数(作用域链)
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
JavaScript中的作用域链和闭包
深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解
js setTimeout 参数传递使用介绍
Javascript获取HTML静态页面参数传递值示例
深入理解JavaScript高级之词法作用域和作用域链
JS的参数传递示例介绍
javascript函数中参数传递问题示例探讨
四种参数传递的形式――URL,超链接,js,form表单
JavaScript函数的调用以及参数传递
相关文章推荐
- 轻松实现javascript图片轮播特效
- javascript中的作用域和闭包详解
- 六,JavaWeb简略的谈下前端技术<三>JavaScript
- Js window.document 的属性、方法和事件汇总【转】
- jsp与模板引擎性能
- js模版引擎handlebars.js实用教程——为什么选择Handlebars.js
- JSON学习笔记整理一
- JavaScript1
- Javascript的块作用域和Java,C++的区别
- js模版引擎handlebars.js实用教程——目录
- Javascript ----字符串(String)中的方法
- Day-14 JS中的JSON,for..in..与数组对象的操作
- JavaScript学习 四、引用类型
- js中的对象
- 浅谈js怎么实现全选按钮
- 浅谈js怎么实现全选按钮
- JS框架与类库的区别
- 非常简洁的仿js树形菜单
- 七牛---关于JavaScript SDK各种问题总结
- 排序—直接排序(js实现)