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

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

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

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

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

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

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

2016年01月12日

PS:我查阅的大部分资料都是来自于网络,如有侵权,请联系我删除

JavaScript学习笔记——JS中的变量复制、参数传递和作用域链的更多相关文章

  1. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

  2. JavaScript学习12 JS中定义对象的几种方式【转】

    avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...

  3. Javascript开发技巧(JS中的变量、运算符、分支结构、循环结构)

    一.Js简介和入门 继续跟进JS开发的相关教程. <!-- [使用JS的三种方式] 1.HTML标签中内嵌JS(不提倡使用): 示例:<button onclick="javas ...

  4. JavaScript学习笔记(八)——变量的作用域与解构赋值

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  5. JS 学习笔记--JS中的事件对象基础

    事件:JavaScript中的事件是由访问web页面用户的一系列操作引起的,比如点击鼠标,键盘按键等.当用户执行某些操作的时候再去执行一些代码. 事件模型:内联模型.脚本模型.DOM2模型 内联模型: ...

  6. [学习笔记]JS中闭包的理解

    一.闭包概念的理解 闭包,又称为词法闭包或函数闭包指引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外. 自由变量:该变量既不是函数本身定义的也不是函数 ...

  7. JAVAscript学习笔记 js句柄监听事件 第四节 (原创) 参考js使用表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 学习笔记--Java中的变量

    Java中的变量 /** * 关于 Java 语言当中的变量: * * 1. 什么是变量? * - 变量的本质上来说是内存空间,这块空间有(数据类型.名字.字面值) * - 变量包括三部分:数据类型. ...

  9. 1. JavaScript学习笔记——JS基础

    1. JavaScript基础 1.1 语法 严格区分大小写 标识符,第一个字符可以是 $,建议使用小驼峰法, 保留字.关键字.true.false.null不能作为标识符 JavaScript是用U ...

随机推荐

  1. Linux转发性能评估与优化-转发瓶颈分析与解决方式(补遗)

    补遗 关于网络接收的软中断负载均衡,已经有了成熟的方案,可是该方案并不特别适合数据包转发,它对server的小包处理非常好.这就是RPS.我针对RPS做了一个patch.提升了其转发效率. 下面是我转 ...

  2. C语言指针的初始化和赋值

    1.指针的初始化 指针初始化时,"="的右操作数必须为内存中数据的地址,不能够是变量,也不能够直接用整型地址值(可是int*p=0;除外,该语句表示指针为空).此时,*p仅仅是表示 ...

  3. kvm虚拟化之克隆篇

    注意:在克隆虚拟机的时候,该虚拟机必须处于关闭状态. 1,查看目前有哪些子机并选择要克隆的子机,我选择关闭test,说明我要克隆的就是它了. 2,查看虚拟机是否关闭. virsh  list --al ...

  4. NET基础课--代码安全

    1.sqlinjection

  5. 获取设备的UUID

    很多时候需要获取设备的UUID,比如在蓝牙交互时,需要获取服务和特征的UUID,那么如何获取设备的UUID呢?请见如下代码: // // ViewController.m // 获取UUID // / ...

  6. java基础知识——程序员面试基础

    一.面向对象的特征有哪些? 答:①.抽象:抽象是忽略一个主题中与当前目标无关的那些方面,一边更充分的注意与当前目标有关的方面.抽象并不打算了解全面问题,而是选择其中的一部分,暂时不用部分细节.抽象包括 ...

  7. [Effective Modern C++] Item 2. Understand auto type deduction - 了解auto类型推断

    条款二 了解auto类型推断 基础知识 除了一处例外,auto的类型推断与template一样.存在一个直接的从template类型推断到auto类型推断的映射 三类情况下的推断如下所示: // ca ...

  8. jquery操作session的方法

    jquery.session.js使用  //此方法在java中不能使用 // jquery.session.js 简单使用方法 添加数据    $.session.set('key', 'value ...

  9. Eclipse运行Tomcat7源码

    1. 各环境版本: jdk1.6.0_45 (亲测jdk1.7.0_07会有问题,不要用1.7版本的) apache-ant-1.9.4 apache-tomcat-7.0.61-src 2. 安装a ...

  10. nodejs学习随机记录

    1. nodejs的顶层对象:global(nodejs中没有window) 2. nodejs一个文件就是一个模块 每个模块都有自己的作用域 通过var声明的变量,只属于当前模块下,并非全局的 va ...