欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JS变量的作用域

程序员文章站 2022-05-03 20:25:30
js变量的作用域 1.1复制基本类型(undefined、null、boolean、number、string --- 按值访问) var num1 = 5; var num2 = num1;...

js变量的作用域

1.1复制基本类型(undefined、null、boolean、number、string --- 按值访问)

var num1 = 5;
var num2 = num1;
console.log(num1);//5
console.log(num2);//5

其中num1=5,num2=5。但是num2的5只是一个副本,两者不会相互影响。

var num1 = 5;
var num2 = num1;
num1 = 3;
console.log(num1);//3
console.log(num2);//5

1.2复制对象

var obj1 = {};
var obj2 = obj1 ;
obj1.name = "mike";

console.log(obj1.name);//mike
console.log(obj2.name);//mike

obj2指针是obj1指针的副本,但俩指针指向同一对象(对象保存在堆内存中、指针在栈内存中)

2:传参

无论是基本类型和引用类型,都是传值

2.1:基本类型

function addone(num){
    num++;
    return num;
}

var count = 1;
var result = addone(count);
console.log(count);//1
console.log(result);//2

2.2 对象

eg1:

function setname(obj){
    obj.name = "mike";
}

var obj = {};
setname(obj);
console.log(obj.name);//mike

eg2:

function setname(obj){
    obj.name = "mike";
    obj = {};//局部对象
    obj.name = "tom";
}

var obj = {};
setname(obj);
console.log(obj.name);//mike

若是传引用,obj.name应该输出tom

3:作用域

part1:

var color = "blue";

function changecoler(){
    

    var anothercolor = "red";
    
    function swap(){
        var temp = anothercolor;
        anothercolor = color;
        color = temp;
        //这里可以访问color、anothercolor和temp
    }

    //这里可以访问color和anothercolor

    swap();
}

//这里只能访问color

changecolor();

包含全局变量color,changecolor局部环境中的anothercolor、swap()环境中的temp。

内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数(会先在自己的变量对象中搜索变量和函数名,如果搜索不到再搜索上一级作用域链)。

part2:没有块级作用域(var)

if(true){
    var color = "blue";
}
console.log(color);//blue

如果是java、c,color会在if语句之后销毁。但在javascript中,在if语句中的变量声明会将变量添加到当前的执行环境(这里指全局)

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

console.log(i);//10

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

若用let:

for(let i = 0;i<10;i++){
    dosomething(i);
}

console.log(i);//uncaught referenceerror: i is not defined

part3:

function add(a,b){
    var sum = a+b;//局部变量sum函数外部访问不到
    return sum;
}

var result = add(1,2);
console.log(result);//3
console.log(sum);//uncaught referenceerror: sum is not defined
function add(a,b){
    sum = a+b;
    return sum;
}

var result = add(1,2);
console.log(result);//3
console.log(sum);//3

去掉var声明后,添加到全局环境中的变量sum将继续存在,即使函数已经执行完毕,后面的代码依然可以访问。