文档章节

JavaScript学习笔记(变量和作用域)

lekabeen
 lekabeen
发布于 2017/09/10 09:45
字数 935
阅读 0
收藏 0
点赞 0
评论 0

1. 基本类型和引用类型的值

        ECMAScript变量包含了两种数据类型的值:基本类型值和引用类型值

基本类型值是简单的数据段,按值访问,可以操作保存在变量中的实际的值,包括:Undefined、Null、Boolean、Number和String

引用类型的值是保存在内存当中的对象。

1.1 动态的属性

        可以为引用类型的值添加、更改和删除属性和方法

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

        但是不能为基本类型的值添加属性,虽然不会报错

var name = "hello";
name.age = 27;
alert(name.age);  //undefined

     

1.2 复制变量值

        基本类型值的变量的复制将会为新变量创建一个新值,对变量的操作互不影响

var num1 = 5;
var num2 = num1;

                                                        

        由于引用类型的值是一个指针,指向堆内存中的模块内存对象,引用类型的变量复制的值是指针,所以会指向同一块内存对象,对变量进行属性和方法的操作便会互相影响

                            

1.3 传递参数

        ECMAScript中所有函数的参数都是按值传递的,就像把值从一个变量复制到另一个变量一样,参数在函数内部都会复制给一个局部变量。

        如下代码是基本类型值的参数传递

function addTen(num){
    num += 10;
    return num;
}

var count = 20;
var result = addTen(count);
alert(count);    //20,没有变化
alert(result);   //30

        引用类型的参数传递,引用类型的变量的值只是一个指针,当变量重新赋值后,其值的指针自然指向不同的内存对象,且不会影响原内存对象的其他指针

function setName(obj){
  obj.name = "hello";
  obj = new Object();
  obj.name = "word";
}

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

 

1.4 检测类型

        typeof操作符可检测变量的值的类型,对于引用类型的变量会返回”object“

var s = "hello";
var b = true;
bar i = 22;
var u;
var n = null;
var o = new Object();

alert(typeof s);    //string
alert(typeof i);    //number
alert(typeof b);    //boolean
alert(typeof u);    //undefined
alert(typeof n);    //object
alert(typeof o);    //object

        想要检测引用类型的值的具体的类时,可用instanceof操作符,返回true或false

alert(person instanceof Object);  //变量person是Object类返回true,否则返回false
alert(colors instanceof Array);  //变量person是Array类返回true,否则返回false

 

2. 执行环境和作用域

        每个执行环境都会创建一个与之关联的变量对象,全局执行环境是最外围的。每个函数都有自己的执行环境,会创建变量对象的一个作用域链。

var color = "blue";

function changeColor(){
	var anotherColor = "red";
	
	function swapColors(){
		var tempColor = anotherColor;
		anotherColor = color;
		color = tempColor;
		
		//这里可以访问colo、anotherColor和tempColor
	}
	
	//这里可以访问color和anotherColor,但不能访问tempColor
	swapColors();
}

//这里只能访问color
changeColor();

                                                    作用域链图

2.1 延长作用域链

        通过try-catch语句中的catch块和with会创建一个新的变量对象,可延长作用域链

function buildUrl(){
	var qs = "?debug=true";
	
	with(location){
		var url = href + qs;
	}
	
	return url;
}

 

2.2 没有快作用域

        JavaScript中没有块作用域

for(var i=0; i<10; i++){
	doSomething(i);
}
alert(i);  //10

        使用var声明的变量会自动添加到最接近的执行环境中,如果初始化变量时没有用var声明,则会添加到全局环境中

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

        变量调用时会从作用域链前段开始找,也就是从最接近的执行环境到最外层的全局环境。

var color  "blue";

function getColor(){
	return color;
}

alert(getColor());  //"blue"
var color  "blue";

function getColor(){
	var color = "red";
	return color;
}

alert(getColor());  //"red"

 

参考文献:    JavaScript高级程序设计(第3版)

© 著作权归作者所有

共有 人打赏支持
lekabeen
粉丝 0
博文 3
码字总数 3679
作品 0
厦门
程序员
【译】【nodeschool】【scope-chains-closures】作用域

作用域链与闭包工作 作用域,作用域链,闭包以及垃圾回收它们有一个共同点:那就是它们通常都是手动执行的。闭包实际上是如何工作的?垃圾回收在什么时候发生?作用域链到底是什么? 通过这次...

小草先森 ⋅ 05/14 ⋅ 0

【前端工程师手册】JavaScript之作用域

【前端工程师手册】JavaScript之作用域 什么是作用域 来一段《你不知道的JavaScript-上卷》中的原话: 几乎所有编程语言最基本的功能之一,就是能够储存变量当中的值,并且能在之后对这个 值...

优惠券活动 ⋅ 05/17 ⋅ 0

这一次,我们换种姿势学习 javascript

前言 《你不知道的 javascript》是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途。本书介绍了该系列的两个主题:“作用...

程序员解决师 ⋅ 05/29 ⋅ 0

js笔记二十九之this关键字

我们在js中主要研究的都是函数中的this js中的this代表的是当前行为执行的主体 js中的context(上下文)代表的是当前行为执行的环境(区域) this是谁和函数在哪定义的和在哪执行的都没有任何的关...

uplyw ⋅ 05/25 ⋅ 0

前端基础(二):变量声明的6种方法

字数:2869 阅读时间:10分钟 最新的ECMAScript规范中,变量声明有var、function、let、const、import、class六种方法。 var 语法: var varname [= value1 [, vaname1[,valname2 ...]]]; 对...

老司机带你撸代码 ⋅ 06/09 ⋅ 0

js的变量提升(hoisting)

js的变量提升最近看了js的文档和教程,知道了js有变量作用域和变量提升这个概念。 方法和{}里,没有var申明的变量,默认是全局的变量,或者是上一级作用域可以访问的变量。 这个在其他语言里...

清天君 ⋅ 05/14 ⋅ 0

15个必备的javascript小技巧,看的懂是入门,全会写就是大神

1、变量转换 看起来很简单,但据我所看到的,使用构造函数,像Array()或者Number()来进行变量转换是常用的做法。始终使用原始数据类型(有时也称为字面量)来转换变量,这种没有任何额外的影...

急速奔跑中的蜗牛 ⋅ 06/06 ⋅ 0

ECMAScript 学习笔记(2)--基本类型及语法相关

1、变量名区分大小写; 注意代码块的概念。 变量分为原始值和引用值:原始值存储在栈,引用值存储在堆(引用值一般是一个指针或对象名、函数名)。在C语言中编译的程序占用的内存分为以下几个...

wx599c47c7bdcad ⋅ 05/24 ⋅ 0

JavaScript核心概念归纳整理

原文出处: 熊俊漉 JavaScript语言本身是一个庞大而复杂的知识体系,复杂程度不低于任何一门后端语言,本文针对JavaScript语言的核心概念进行简单的梳理,对应的每个知识点仅仅点到为止,不作...

音乐宇Code ⋅ 05/27 ⋅ 0

你不懂js系列学习笔记-异步与性能- 05

第五章: 程序性能 原文:You-Dont-Know-JS 这本书至此一直是关于如何更有效地利用异步模式。但是我们还没有直接解释为什么异步对于 JS 如此重要。最明显明确的理由就是 性能。 举个例子,如果...

寇格莫 ⋅ 05/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring MVC基本概念

只写Controller

颖伙虫 ⋅ 12分钟前 ⋅ 0

微软重金收购GitHub的背后逻辑原来是这样的

全球最大的开发者社区GitHub网站花落谁家的问题已经敲定,微软最终以75亿美元迎娶了这位在外界看来无比“神秘”的小家碧玉。尽管此事已过去一些时日,但整个开发者世界,包括全球各地的开源社...

linux-tao ⋅ 13分钟前 ⋅ 0

磁盘管理—逻辑卷lvm

4.10-4.12 lvm 操作流程: 磁盘分区-->创建物理卷-->划分为卷组-->划分成逻辑卷-->格式化、挂载-->扩容。 磁盘分区 注: 创建分区时需要更改其文件类型为lvm(代码8e) 分区 3 已设置为 Linu...

弓正 ⋅ 33分钟前 ⋅ 0

Spring源码解析(六)——实例创建(上)

前言 经过前期所有的准备工作,Spring已经获取到需要创建实例的 beanName 和对应创建所需要信息 BeanDefinition,接下来就是实例创建的过程,由于该过程涉及到大量源码,所以将分为多个章节进...

MarvelCode ⋅ 53分钟前 ⋅ 0

js模拟栈和队列

栈和队列 栈:LIFO(先进后出)一种数据结构 队列:LILO(先进先出)一种数据结构 使用的js方法 1.push();可以接收任意数量的参数,把它们逐个推进队尾(数组末尾),并返回修改后的数组长度。 2....

LIAOJIN1 ⋅ 今天 ⋅ 0

180619-Yaml文件语法及读写小结

Yaml文件小结 Yaml文件有自己独立的语法,常用作配置文件使用,相比较于xml和json而言,减少很多不必要的标签或者括号,阅读也更加清晰简单;本篇主要介绍下YAML文件的基本语法,以及如何在J...

小灰灰Blog ⋅ 今天 ⋅ 0

IEC60870-5-104规约传送原因

1:周期循环2:背景扫描3:自发4:初始化5:请求6:激活7:激活确认8:停止激活9:停止激活确认10:激活结束11:远程命令引起的返送信息12:当地命令引起的返送信息13:文件传送20:响应总召...

始终初心 ⋅ 今天 ⋅ 0

【图文经典版】冒泡排序

1、可视化排序过程 对{ 6, 5, 3, 1, 8, 7, 2, 4 }进行冒泡排序的可视化动态过程如下 2、代码实现    public void contextLoads() {// 冒泡排序int[] a = { 6, 5, 3, 1, 8, 7, 2, ...

pocher ⋅ 今天 ⋅ 0

ORA-12537 TNS-12560 TNS-00530 ora-609解决

oracle 11g不能连接,卡住,ORA-12537 TNS-12560 TNS-00530 TNS-12502 tns-12505 ora-609 Windows Error: 54: Unknown error 解决方案。 今天折腾了一下午,为了查这个问题。。找了N多方案,...

lanybass ⋅ 今天 ⋅ 0

IDEA反向映射Mybatis

1.首先在pom文件的plugins中添加maven对mybatis-generator插件的支持 ` <!-- mybatis逆向工程 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-ma......

lichengyou20 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部