作用域
作用域:局部作用域、全局作用域
var num1 = 1;
var num2 = 2;
const fun1 = (n1,n2) => {
var num3 = 3;
n1 = 10;
n2 = 20;
console.log(num1,num2,num3,n1,n2); // 1 2 3 10 20
}
fun1(num1,num2);
console.log(num1,num2); // 1 2
console.log(num3); // error: num3 is not defined
console.log(n1,n2);
打印结果
1 2 3 10 20
1 2
error: num3 is not defined
// 以下的报错信息不会显示出来,因为上一个报错信息会阻止下面的代码继续执行
error: n1 is not defined
error: n2 is not defined
结论
-
任何地方都能访问到的对象拥有全局作用域
在上面的例子中 num1、num2是全局作用域的变量,函数内部可以访问到外部的变量
-
变量在函数内声明,变量为局部作用域
在上面的例子中 num3、n1、n2是局部作用域的变量,函数外部访问不了函数内部的变量
作用域的引用类型传递
function fun2(name,age){
this.name = name;
this.age = age;
}
const zs = new fun2('zs',18);
console.log(zs.name); // zs
const fun3 = (p) => {
p.name = 'ls';
p = new fun2('ww',20);
console.log(p); // fun2 {name: 'ww', age: 20}
p.name = 'ml';
console.log(p.name); // ml
}
fun3(zs);
console.log(zs.name); // ls
console.log(zs); // fun2 {name: 'ls', age: 18}
打印结果
zs
fun2 {name: 'ww', age: 20}
ls
fun2 {name: 'ls', age: 18}
结论
-
堆内存的地址改变后的情况下,外部无法读取被修改的属性
在func3函数内部: 在new func2之前修改的name生效了(外部可取读取到该name) 在new fun2 之后修改的name为内部地址的name