JS变量的作用域
程序员文章站
2022-10-31 17:47:40
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将继续存在,即使函数已经执行完毕,后面的代码依然可以访问。