变量包含两种数据类型的值:
1. 基本类型值如undefined、boolean、Null、number、string,这类值是可以直接操作的,有读写权
2.引用类型值:保存在内存中的对象。可以引用添加属性,不能对值进行操作,只有读的权限。可以对其添加属性和方法,也能改变或删除其属性或方法
这两种值在进行复制时机制也不同:
1.基本类型值:靠值
var num1=5;
var num2=num1;
num1+=;
alert(num2) //5
num1与num2是相互独立的,相当于开辟一块新的内存,num1和num2再进行改变,互相不会影响。
2.引用类型值:靠引用
var obj1=new object();
var obj2=obj1;
obj1.name="jone";
console.log(obj2.name) //jone
相当于obj1和obj2都指向object()这个对象所在内存,属性一样。若object()改变,obj1、obj2都会改变。
参数的传递:EMACScript中所有函数的参数传递都是按值传递的(开辟新内寸,参数与被当做参数传递的对象互不干扰)
1.基本类型值被当做参数传值是按照值的方式传递,很好理解。
function plus(num){
num+=10;
return num;
}
var num1=20;
var num2=plus(num1);
alert(num1); //20
alert(num2); //30
2.引用类型值被当做参数传递也是按值传递的(改变参数并不能改变被当做参数传递的对象,参数和传递对象驻扎在两块不同的内存中)
function setName(obj){
obj.name="jone";
obj = new Object(); //参数在此被改变,加上name属性
obj.name="linda";
alert(obj.name) //linda 局部变量,函数执行之后被立即销毁,不复存在
}
var person= new Object();
setName(person)
alert(person.name) //jone 并没有变成linda
函数的参数相当于局部变量,被当做参数传递的对象是全局对象/变量。
执行环境和作用域:
执行环境定义了变量或者函数访问其他数据的权限。
web浏览器全局执行环境被认为是window对象,浏览器退出时全局执行环境才会被销毁。
每个函数都有自己的执行环境,执行流进入某一函数时,函数环境就会被推入一个环境栈中,函数执行之后栈将其弹出,控制权返回给之前的执行环境。该机制控制EMACScript的执行流程。让执行环境有序进行。
代码运行到某一环境时候,会创建变量对象的作用域链。作用域链让执行环境的变量和函数被有序访问。
内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。
局部环境会现在自己的变量对象中搜索变量和函数,如果搜索不到再搜索上一级作用域链。