变量,作用域和内存问题

1
JS的数据类型分为基本数据类型和引用数据类型
基本数据类型分为Undefined Null String Number Bool
关于引用数据类型
var a = new Object();
a.name = “lili”;
alert(a.name);//lili

但是基本数据类型是不能添加任何属性的
var a = “hello,world”;
a.name = “lili”;
alert(a.name);//undefined

2 复制变量值
基本数据类型进行复制时是值传递变量,作用域和内存问题_第1张图片
如图:num1 num2是独立的个体,他们之间不互相影响
在这里要插一句,typeof null === “object”,但是为什么Null也是基本数据类型呢 ,我想是因为Null在堆内存中不占据空间
但是在复制引用类型的时候是这样的
变量,作用域和内存问题_第2张图片
如图,对引用类型的复制时对对象的指针的复制,所以,可以看到两个变量都指向同一个Object

// quoteTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 
using namespace std;

class A
{
private:
    int a;
public:
    A(){}
    ~A() {}
    void setParam(int param )
    {
        a = param;
    }

    int getParam()
    {
        return a;   
    }
};

void Change(A& a)
{
    a.setParam(100);
}

void ChangeEx(A& a)
{
    a.setParam(100);
    A* b = new A();
    b->setParam(200);
    a = *b;
    //a = new A;
}

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    Change(a);
    cout<<a.getParam()<;
    ChangeEx(a);
    cout<<a.getParam()<;
    system("pause");
    return 0;
}

最后的运行结果变量,作用域和内存问题_第3张图片

所以,如果真是引用传递的话,改变传入参数的指针地址,那么外部参数的地址也会发生改变,看下JS

function setName(obj){
    obj.name = "xx";
    obj = new Object();
    obj.name = "zz";
}

var s = new Object();
s.name = "yy";

setName(s);

console.log(s.name);//输出xx

运行这段代码,我们发现还是输出xx,所以在函数内部,无法改变引用对象的指向地址,所以结论是 JS 的引用类型采用的是值传递
3 检测类型
平时我们检测类型使用的是typeof,但是typeof检测对象类型时只能告诉你是Object 所以 JS 提供了新的检测运算符
instanceof

var reg = /sid/g;
那么,通过instanceof 就可以探测到它是什么类型的对象
reg instanceof RegExp === true

4执行环境和作用域
执行环境是JS中一个重要的概念
全局执行环境是window对象 ,每个函数都有自己的执行环境,当函数流程进入一个函数时,函数的环境就会被推入环境栈中,当这个函数执行完成时,栈将其弹出

当代码在一个环境中执行时,会创建变量对象的作用域链以保证变量对象和函数的有序访问

var color = "blue";
function changeColor(){
    var anotherColor = "red";
    function swapColor(){
        var tempColor = anotherColor;
        anotherColor = color;
        color = tempColor;
        //这里可以访问 tempColor anotherColor color
    }
    //这里可以访问anotherColor color 但是无法访问 tempColor
    swapColor();
}
//这里只能访问color
changeColor();

以上代码中有三个执行环境:全局作用环境,changeColor的作用环境 swapColor的作用环境
全局作用域中有1个color,还有1个函数changeColor
changeColor有1个anotherColor 和 函数 swapColor,它可以访问anotherColor,也可以访问全局作用域中的color
swapColor 则可以访问函数内的tempColor 和他的父作用域的anotherColor 和全局作用域的color

用一张图来表示就是变量,作用域和内存问题_第4张图片

此外 catch 和 with 能延长作用域链

你可能感兴趣的:(js高级程序设计)