变量、作用域、内存问题

最新更新: 2019-09-03 11:11:50 阅读: 34次

1、复制变量值

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

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


2、传递参数

ECMAScript 中所有函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变复制到另一个变量一样。基本类型值的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。有不少开发人员在这一点上可能会感到困惑,因为访问变量有按值和引用两种方式,而参数只能按照值传递。

   在向参数传递基本类型的值时,被传递的值会被复制到一个局部变量(即命名参数,或者用ECMAScript的概念来说,就是arguments对象中的一个元素)。在向参数传递引用类型的值时,会把这个值存在内存中的一个地址复制给一个局部变量,因此这个局部变量的变化会反应在函数的外部。

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="Nicholas";
}
var person =new Object();
setName(person);
alert(person.name); // Nicholas

以上代码中创建一个对象,并将其保存在了变量person中。然后,这个对象传递到setName() 函数中之后就被复制到了obj。在这个函数内部,obj和person引用同一个对象。换句话说,即使这个对象是按值传递的,obj也会按引用来访问同一个对象。






参考:

1、JavaScript高级程序设计(第三版)