JavaScript变量类型以及变量作用域详解


Posted in Javascript onAugust 14, 2017

变量类型

ECMAScript变量可能包含两种不同类型的数据值:基本类型和引用类型。

基本类型

基本类型指的是简单的数据段,5种基本数据类型:undefined、null、boolean、number、string,基本数据类型是按值访问的,因此可以操作保存在变量中的实际的值。

复制变量值

从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。例如:

var num1 = 5;
var num2 = num1;

复制前的变量对象

JavaScript变量类型以及变量作用域详解

复制后的变量对象

JavaScript变量类型以及变量作用域详解

引用类型

引用类型指那些可能由多个值构成的对象,引用类型的值是保存在内存中的对象,JavaScript不允许直接访问内存中的位置,在操作对象时,实际上是在操作对象的引用而不是实际的对象,因此,引用类型的值是按引用访问的。

动态属性

引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法。如果对象不被销毁或者这个属性不被删除,则这个属性将一直存在,但是我们不能给基本类型的值添加属性。例如:

var person = new Object();
person.say = "hello";
alert(person.say); //"hello"

复制变量值

从一个变量向另一个变量复制引用类型的值时,也会将存储在变量对象中的值复制一份放到为新变量分配的空间中,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制结束后,两个变量实际上将引用同一个对象,改变其中一个变量,就会影响另一个变量。例如:

var obj1 = new Object();
var obj2 = obj1;
obj1.say = "hello";
alert(obj2.say); //"hello"

JavaScript变量类型以及变量作用域详解

传递参数

ECMAScript中所有函数的参数都是按值传递的,把函数外部的值复制给函数内部的参数。在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量;在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。例如:

function addTen(num) {
 num += 10;
 return num;
}
var count = 20;
var result = addTen(count);
alert(count);  //20 
alert(result);  //30

执行环境及作用域

执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为。
全局执行环境是最外围的执行环境,在WEB浏览器中,全局执行环境被认为是window对象,因此全局变量和属性都是作为window的属性和方法创建的。
每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,在函数执行之后,栈将其弹出,将控制权返回给之前的执行环境。
当代码在一个环境中执行时,会创建变量对象的一个作用域链,作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端始终是当前指行代码所在的变量对象,作用域链中下一个变量对象来自外部环境,再下一个变量对象来自下一个外部环境,这样一直延续到全局环境,全局执行环境的变量对象始终是作用域链的最后一个对象。
标识符解析是沿着作用域链一级一级地搜索标识符的过程。搜索过程始终从作用域链的前端开始,然后逐级地向后回溯,直到找到标识符为止。

JavaScript变量类型以及变量作用域详解

内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。

无块级作用域

JavaScript中没有块级作用域,例如:

if(true){
 var color = "blue";
}
alert(color);  //"blue"

在函数中未使用var声明的变量会被成全局变量,例如:

function add(num1,num2){
 sum = num1 + num2;
 return sum;
}
var result = add(10,20);
alert(sum);  //30

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
你所要知道JS(DHTML)中的一些技巧
Jan 09 Javascript
面向对象的javascript(笔记)
Oct 06 Javascript
jQuery 获取对象 基本选择与层级
May 31 Javascript
JQuery index()方法使用代码
Jun 02 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
Apr 24 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
Dec 14 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
Jan 15 Javascript
AngularJS的ng Http Request与response格式转换方法
Nov 07 Javascript
Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#‘的解决方法
Jun 17 Javascript
React 组件间的通信示例
Jun 14 Javascript
详解node和ES6的模块导出与导入
Feb 19 Javascript
Js实现粘贴上传图片的原理及示例
Dec 09 Javascript
jQuery:unbind方法的使用详解
Aug 14 #jQuery
通过V8源码看一个关于JS数组排序的诡异问题
Aug 14 #Javascript
关于Vue Webpack2单元测试示例详解
Aug 14 #Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
Aug 14 #Javascript
Vue.js如何实现路由懒加载浅析
Aug 14 #Javascript
JavaScript中的return布尔值的用法和原理解析
Aug 14 #Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
Aug 14 #Javascript
You might like
BBS(php & mysql)完整版(六)
2006/10/09 PHP
wamp安装后自定义配置的方法
2014/08/23 PHP
php匹配字符中链接地址的方法
2014/12/22 PHP
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
让checkbox不选中即将选中的checkbox不选中
2014/07/11 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
2014/12/18 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
2016/09/17 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
9种方法优化jQuery代码详解
2020/02/04 jQuery
如何使用Javascript中的this关键字
2020/05/28 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
python 布尔操作实现代码
2013/03/23 Python
在Python的循环体中使用else语句的方法
2015/03/30 Python
如何用Python实现简单的Markdown转换器
2018/07/16 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
django 类视图的使用方法详解
2019/07/24 Python
使用pytorch和torchtext进行文本分类的实例
2020/01/08 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
白俄罗斯大卖场:21vek.by
2019/07/25 全球购物
100%法国制造的游戏和玩具:Les Jouets Français
2021/03/02 全球购物
Ibatis的核心配置文件都有什么
2014/09/08 面试题
意向书范文
2014/03/31 职场文书
12岁生日演讲稿
2014/05/14 职场文书
留学生求职信
2014/06/03 职场文书
大学生就业求职信
2014/06/12 职场文书
好媳妇事迹材料
2014/12/24 职场文书
2015年教务工作总结
2015/05/23 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python