变量、作用域与内存问题
2017-11-19 10:40
232 查看
ECMAScript中包含两种不同的数据类型的值:基本类型值和引用类型值
基本类型值没有属性而引用类型的值可以有属性
基础类型值在复制的时候,会创建一个新的内存空间 放入存储的值
例如:
这样操作就保存了两个值,改变一个值并不会影响另一个的值,而引用类型的值不同
例如:
这个值的副本实际上是一个指针,指向一个对象,因此改变一个的值也会改变另一个的值
PS:函数传递参数的时候也是值传递,并不是引用传递
当代码在一个环境中执行时,会创建一个变量的作用域链。保证对执行环境的有权访问的所有变量和函数的有序访问。作用域链的前端永远是当前执行代码的所在环境的变量对象。
例如:
之所以函数中可以访问到color这个变量,是因为可以在上一级的作用域链中找到他
在这个函数中,swapColor中可以访问到tempColor,anotherColor,color三个变量,而changeColor中不能访问到tempColor;但可以向上访问到color,和自己的anotherColor。也就是说不通过闭包或其他方式,不能访问到子执行环境,只能向上访问。
Javascript不像其他语言,由于花括号封闭的代码都有自己的作用域。JS没有自己的块级作用域。
如果是C C+ java的环境中,color会在if语句执行完毕后被销毁。但是在javascript中,if语句的变量声明会将变量添加到当前环境
在for循环中
即使在for循环结束后,i的值依旧存在于循环外部的执行环境中
当在某个环境中读取或写入而引用一个变量的时候,会从作用域链的前端开始搜索,一直向上搜索,也就是上面所说的,会从局部环境向全局搜索,而不能向子环境搜索变量名。
基本类型值没有属性而引用类型的值可以有属性
引用类型: var person =new Object(); person.name="burning"; console.log(person.name); //burning 基础类型: var name="Burning"; name.age=27; console.log(name.age);//undefined
基础类型值在复制的时候,会创建一个新的内存空间 放入存储的值
例如:
var a=10; var b=a;
这样操作就保存了两个值,改变一个值并不会影响另一个的值,而引用类型的值不同
例如:
var a=new Object(); var b=a; a.name="burning"; console.log(b.name); //burning
这个值的副本实际上是一个指针,指向一个对象,因此改变一个的值也会改变另一个的值
PS:函数传递参数的时候也是值传递,并不是引用传递
作用域部分
执行环境是JS中最为重要的一个部分,执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为。每个执行环境都有一个与之匹配的变量对象,环境中定义的所有变量和函数都保存在这个环境中。当代码在一个环境中执行时,会创建一个变量的作用域链。保证对执行环境的有权访问的所有变量和函数的有序访问。作用域链的前端永远是当前执行代码的所在环境的变量对象。
例如:
var color="blue"; function changeColor(){ if(color==="blue"){ color="pink"; }else{ color="blue"; } } alert(color);//blue changeColor() alert(color);//pink
之所以函数中可以访问到color这个变量,是因为可以在上一级的作用域链中找到他
var color="blue"; function changeColor(){ var anotherColor="red"; function swapColor(){ var tempColor=anotherColor; anotherColor=color; color=tempColor; } swapColor(); } changeColor();
在这个函数中,swapColor中可以访问到tempColor,anotherColor,color三个变量,而changeColor中不能访问到tempColor;但可以向上访问到color,和自己的anotherColor。也就是说不通过闭包或其他方式,不能访问到子执行环境,只能向上访问。
Javascript不像其他语言,由于花括号封闭的代码都有自己的作用域。JS没有自己的块级作用域。
if(true){ var man="burning"; } alert(color); //burning;
如果是C C+ java的环境中,color会在if语句执行完毕后被销毁。但是在javascript中,if语句的变量声明会将变量添加到当前环境
在for循环中
for(var i=0;i<10;i++){ } alert(i);//10
即使在for循环结束后,i的值依旧存在于循环外部的执行环境中
变量部分
在JS中,用var声明的变量会被添加到最近的环境中。在函数内部,就是局部变量,不用var声明的就是全局变量,但是会占用内存。当在某个环境中读取或写入而引用一个变量的时候,会从作用域链的前端开始搜索,一直向上搜索,也就是上面所说的,会从局部环境向全局搜索,而不能向子环境搜索变量名。
相关文章推荐
- 有关js的变量、作用域和内存问题
- JavaScript基础(2)变量,作用域和内存问题
- #《JavaScript高级程序设计》读书笔记 - 变量、作用域和内存问题
- javascript高级程序设计第四章:变量、作用域和内存问题读书笔记
- 变量、作用域和内存问题
- JS学习笔记(二)变量、作用域及内存问题
- 第四章 变量、作用域和内存问题
- JavaScript 变量、作用域和内存问题
- 变量、作用域和内存问题
- JavaScript高级程序设计学习笔记第四章--变量、作用域和内存问题
- 《JavaScript高级程序设计》学习笔记(3)——变量、作用域和内存问题
- 变量、作用域和内存问题 - 基本类型和用类型的值
- 第四章:变量、作用域和内存问题
- javascript高级程序设计(变量、作用域和内存问题)
- js高级程序设计(四)变量、作用域和内存问题
- javascript高级程序设计学习笔记——第四章 变量、作用域和内存问题
- JavaScript高级程序设计2--变量、作用域和内存问题
- 23. 变量、作用域和内存问题
- 《JavaScript高级程序设计》 - 读书笔记 - 第4章 变量、作用域和内存问题
- Javascript高级程序设计第二版第四章--变量,作用域及内存问题--笔记