JavaScript学习笔记--JS中的变量复制、参数传递和作用域链

boyanx3个月前技术教程11

今天在看书的过程中,又发现了自己目前对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:我查阅的大部分资料都是来自于网络,如有侵权,请联系我删除

标签: js弹窗

相关文章

给大伙支两招,一键去网页跳转弹窗

很多网页都加入了一个鸡贼的操作——「打开 App 阅读全文」。明明可以一次性把内容展示出来,非得给你隐藏一半,剩下一半需要下载 App 才能看。要不是隔着一条网线,这种话说到一半的人,真的,应该拖出去...

JS打造“九宫格抽奖”_js实现九宫格抽奖

在如今的营销活动中,抽奖功能已经成为提升用户活跃度的标配。尤其是“九宫格抽奖”这种形式,因其视觉冲击力强、交互简单、适配性好,被广泛应用于电商、社交、内容平台等各类场景。本文将带你从零开始,使用 原生...

如何使用JavaScript实现Alert弹窗?

在 JavaScript 语言中,有两种方式可以实现 Alert 弹窗,一种为使用浏览器内置的原生 alert() 函数,另外也可通过自定义 DOM 元素和 CSS 实现自定义弹窗。下文为您详细介绍这...

解决电脑开机 “A JavaScript error in the main process” 弹窗!

当您的电脑一开机就出现一个名为 "A JavaScript error in the main process" 的弹窗时,这可能是由于多种原因引起的。解决此问题的步骤可能包括清除浏览...

react router页面跳转二次确认弹窗及样式、业务逻辑自定义

我们在编辑页面时如果需要跳走通常会需要给用户提示,react router本身已经给了我们这样的功能,我们先看看怎么使用。初见二次确认弹窗// App.jsx const App = () {...

js逆向,web逆向技巧分享_js逆向工程

当我们抓取网页端数据时,经常被加密参数、加密数据所困扰,如何快速定位这些加解密函数,尤为重要。在这里分享一些技巧,如有遗漏,欢迎补充。所需工具:浏览器(Chrome,Edge等)搜索全局搜索适用于根据...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。