前端入门-JS的作用域

355 阅读1分钟

作用域

作用域:局部作用域、全局作用域

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