首页 > 代码库 > JS的作用域

JS的作用域

变量包含两种数据类型的值:

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的执行流程。让执行环境有序进行。

代码运行到某一环境时候,会创建变量对象的作用域链。作用域链让执行环境的变量和函数被有序访问。

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

局部环境会现在自己的变量对象中搜索变量和函数,如果搜索不到再搜索上一级作用域链。

 

JS的作用域