变量、作用域和内存问题

这篇文章简单的总结javascirpt 高级程序设计的第四章。

变量的复制

  • 基本数据类型变量的复制,会创造一个副本
var num1 = 5;
var num2 = num1;

num2 是num1 的一个副本,以后这两个变量可以参与任何操作而不会互相影响。

  • 引用类型变量的复制,复制的是指针,因此两个变量指向同一个变量
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas"
alter(obj2.name); //"Nicholas"


首先,变量obj1保存了一个对象的实例。然后,这个值(指针)被复制到了obj2. 所以,obj1和obj2指向同一个对象。

传递参数

ECMAScript中所有函数都是按值传递。也就是说,把函数外面的值复制给函数内部的参数。

  • 基本数据类型
function addTen(num) {
    num += 10;
    return num;
}

var count = 20;
var result = addTen(count);
alert(count); //20 ,没有变化 
alert(result); //20
  • 引用数据类型
function setName(obj){
    obj.name = "Nicholas;"
}

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

为了证明对象是按值传递的,请看以下代码

function setName(obj){
    obj.name = "Nicholas;"
    obj = new Object();
    obj.name = "Greg";
}

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

如何person 是按引用传递的,那么person 就会自动被修改为指向其name属性值为’Greg’ 的新对象。

检测类型

  • 基本数据类型(typeof)
var s = "Nicholas";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();

typeof s; //string
typeof b; //boolean
typeof i; //number
typeof u; //undefined
typeof n; //object
typeof 0; //object

注意typeof 不是函数,是操作符(operator)

  • 引用数据类型(instanceof)
person instanceof Object; // person 是Object 嘛?
colors instanceof Array; // color 是 Array嘛?
pattern instanceof RegExp //pattern 是RegExp 吗

执行环境和作用域

var color = "blue";

function changeColor(){
    var anotherColor = "red";

    function swapColors(){
    var tempColor = anotherColor;
    anotherColor = color;
    color = tempColor;

    //这里可以访问color, anotherColor 和tempColor
    }
    // 这里可以访问color 和anotherColor,但不能访问tempColor
    swapColors();
}
//这里只能访问color
changeColor();

没有块级作用域

在C的语言中,由花括号封闭的代码块有自己的作用域,但在javascript中没有

if(ture){
    var color = "blue";
}

alert(color); //blue

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

alert(i); //10

对于javascript来说, 由for语句创建的变量i即使在for循环执行结束后,也依然会存在循环外部的执行环境中

声明变量

  • 使用var 声明的变量会自动被添加最接近的环境中
    • 在函数内部,最接近的环境就是函数的局部环境
  • 如果没有使用var声明,该变量会自动被添加到全局环境

查询标识符

  • 搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。
var color  = "blue" ;
function getColor(){
    return color;
}
alert(getColor()); //"blue"

在这个过程中,如果存在一个局部变量的定义,则搜过会自动停止。

发表评论

电子邮件地址不会被公开。 必填项已用*标注