域解析

2020-02-21  本文已影响0人  sugar_sugar_ya

函数变量及作用域

隐式全局变量:变量没有声明,直接赋值,执行到时,浏览器才会偷偷把变量提升为隐式全局变量

全局作用域:在函数声明之外的作用域

预解析:

  1. 所有的变量声明,都会提升到最顶部,但不会提升赋值
  2. 所有的函数声明,都会提升到最顶部,但不会提升函数的调用
  3. 如果同时有多个 var 声明的相同的变量,后面的 var 将被忽略
  4. 如果同时有多个同名的函数,后面的函数将会覆盖前面的函数
  5. 如果声明的变量和声明的函数同名,声明的函数将会覆盖声明的变量

词法分析3步骤:

  1. 先分析函数形参(默认值为undefined),再分析形参赋值(没有形参的直接忽略此步骤)
  2. 分析函数体中所有的变量声明:
    2.1 如果变量名与形参名相同时,直接忽略var;
    2.2 如果变量名与形参名不同时,就相当于声明了一个变量,如var foo,值为undefined;
  3. 分析函数体中所有的函数声明,
    3.1 如果函数名与变量名相同,函数将作为变量的值;
    3.2 如果函数名与变量名不相同,相当于var 函数名 = function 函数名 () {};

函数执行过程分为2步:

  1. 词法分析过程;
  2. 执行过程

栗子1:

function a(b) {
      console.log(b); 
      function b() {
       console.log(b); 
      }
      b();
    b=1
}
a(1);

栗子2:

function t3(greet) {
      console.log(greet); //?
      var greet = 'hello';
      console.log(greet); //?
      function greet() {
      };
      console.log(greet); //?
}
t3(null);

栗子3:

function test(a, b) {
      console.log(a); 
      console.log(b); 
      var b = 234;
      console.log(b); 
      a = 123;
      console.log(a); 
      function a() {
      }
      var a;
      b = 234;
      var b = function () {
      }
      console.log(a); 
      console.log(b); 
    }

test(1);

知识点补充:

arguments是一个对应于传递给函数的参数的类数组对象。(可以获取实参)

function fn(a,b) {
    console.log(arguments);
    console.log(arguments[0]);
    console.log(arguments[0] = 4);
    console.log(a);
}
fn(1,2,3);

栗子4:

a = 100;
function demo(e) {
    function e() {
    }
    arguments[0] = 2;
    console.log(e);//?
    if (a) {
       var b = 123;
    }
    a = 10;
    var a;
    console.log(b); //?
    f = 123;
    console.log(a); //?
 }

 var a;
 demo(1);
 console.log(a); //?
 console.log(f); //?

具名函数中的变量不能用来调用函数

var a = function b() {
    console.log(123);
}
a();//123
b();报错
上一篇下一篇

猜你喜欢

热点阅读