JavaScript-作用域

  • A+
所属分类:Web前端
摘要

 


作用域有:全局作用域和局部作用域

var  除了函数的{}之外,其他地方都不会认为是子作用域
let   在任意{ }里面,如果用的是let关键词定义的变量,那么这个{}视为一个子作用域,在for的()里面,用let定义变量,视为子作用域.

Var的解析

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

举例说明如下:

    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)

1.  let  :同作用域下,let 不允许重名
2.  var 与 function 可以重名   
注  :1.var var重名,就当成同一个变量来看   
  2.  function function重名,以最后面的对准.   
  3.   var function重名,(1.定义)过程中,以function为准   
  4.  执行后重新赋值,以赋值的值为准
 

举例说明如下:

    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(); */