JS作用域问题

530 阅读2分钟

直接举例子: 1 console.log(a);

解析:控制台会报错,因为a没有定义。

2 console.log(a); var a = 1;

解析:打印underfined,因为js预解析机制把var声明的变量先赋值为打印underfined。

3 console.log(a); a = 1;

解析:控制台会报错,因为没有var声明,js没有预解析。

4 console.log(a); var a = 1; console.log(a); function a(){ console.log(2); } console.log(a); a();

解析:首先预解析,把var a赋值underfined,由于函数a()跟变量var a冲突,所以函数a会把变量a覆盖,声明了a(),变量var a就不存在了,解析完开始执行,第一个console.log打印了a(),由于var a赋值了1,函数变成了变量,第二个console.log打印的是1,function a(){}已经声明了,所以跳过直接走第三个console.log,打印的也是1,然后执行a()会报错,因为a现在是变量。

5 var a = 1; function fn(){ console.log(a); var a = 2; } fn(); console.log(a);

解析:全局变量a和局部变量a先赋值underfined,执行fn(),打印的局部变量a的值是underfined,第二个console打印是全局变量a的值,是1

6 var a = 1; function fn(){ console.log(a); a = 2; } fn(); console.log(a);

解析:全局变量a先赋值underfined,fn()里面的a由于没有var 所以不会预解析,执行fn()会打印1是因为局部变量a找不到,然后找上层作用域的变量a,打印完a被赋值了2,第二个打印是2

7 var a = 1;
  function fn(a){
      console.log(a);
      a = 2;
  }
  fn();
  console.log(a);
  
  解析:全局变量a先赋值underfined,由于局部变量a作为参数来传,所以预解析也给局部变量a赋值了underfined,fn()执行第一个打印是underfined,第二个打印是全部变量的值1.
  
  8 var a = 1;
  function fn(a){
      console.log(a);
      a = 2;
  }
  fn(a);
  console.log(a);
  
  解析:全局变量a先赋值underfined,由于局部变量a作为参数来传,所以预解析也给局部变量a赋值了underfined,fn(a)把1传进去了,执行第一个打印是1,a虽然赋值了2,但是它是局部变量,所以第二个打印是全部变量的值1.