Javascript之作用域

JavaScript-作用域

var 除了函数的{}之外,其他地方都不会认为是子作用域.

let 在任意{ }里面,如果用的是let关键词定义的变量,那么这个{}视为一个子作用域,在for的()里面,用let定义变量,视为子作用域.

Var的解析

  • 定义 -- 找出变量 (找当前作用域所有的 var、function 两个关键词定义出来的变量)
  • 执行 -- 从上到下,执行代码 (取值,就近原则,当前作用域有值就取当前,没有就取父级)

举个例子:

    var x = 5;
    a();
    function a(){
      alert(x);
      var x = 10;
    }
    alert(x);

    /*
    * 1. 定义
    *   15:var x;
    *   17-20: function a(){...}
    *
    * 2. 执行
    *   15: x=5;
    *   16: a();   ==子作用域==> 1. 定义
    *                             19: var x;
    *                           2. 执行
    *                             18: alert(x); //undefined
    *                             19: x = 10;(改变的是自己作用域的x)
    *   21: alert(x); //5
    *
    *
    * */

重名注意事项(var,function,let)

  • let :同作用域下,let 不允许重名
  • var 与 function 可以重名
  • 注:

    • var var重名,就当成同一个变量来看
    • function function重名,以最后面的为准
    • var function重名,(1.定义)过程中,以function为准
    • 执行后重新赋值,以赋值的值为准

举个例子:

    alert(a);
    var a = 10;
    alert(a);
    function a(){alert(20)}
    alert(a);
    var a = 30;
    alert(a);
    function a(){alert(40)}
    alert(a);

    /*
    * 1. 定义
    *   22: function a(){alert(40)}
    *
    * 2. 执行
    *   15: alert(a); // 打印函数体function a(){alert(40)}
    *   16: a = 10;
    *   17: alert(a); // 10
    *   19: alert(a); // 10
    *   20: a = 30;
    *   21: alert(a); // 30
    *   23: alert(a); // 30
    *
    * */

闭包

  • 函数里面嵌套一个函数,内部函数使用了外部函数的参数/变量,形成闭包
  • 在一个作用域中包含一个作用域,子作用域使用了父作用域的 参数/变量 ,形成闭包

举个例子:

    (function(){

      let a = 10;
      document.onclick = function(){
        a ++;
        console.log(a);
      };

    })();

/*     function a(){
      let x = 20;

      return function() {
        x ++;
        console.log(x);
      }
    }

    let b = a(); */
/* 
    b();
    b();
    b();
    b();
    b();


    let c = a();

    c();
    c();
    c();
    c();
    c(); */

本文链接:

https://yoefs.com/archives/31/
1 + 6 =
快来做第一个评论的人吧~