• Js作用域与闭包


      在JavaScript中,作用域是执行代码的上下文。作用域有三种类型:全局作用域、局部作用域(或“函数作用域”)和eval作用域。

      在函数内部使用var定义的代码,其作用域是局部的。

      

    var foo = 0; // 全局作用域
    console.log(foo); // 0
    
    var myFunction = function() {
    console.log(foo); // undefined (下面var foo的声明在此作用域提升) var foo = 1; // 局部作用域 console.log(foo); // 1 var myNestedFunction = function() { var foo = 2; // 局部作用域 console.log(foo); // 2 } }

    eval('var foo = 3; console.log(foo);'); // eval()作用域 3

    console.log(foo); // 3

      JavaScript没有块作用域

    var foo = 1;
    
    if (true) {
      foo = 2;
      for (var i = 3; i <= 5; i++) {
        foo = i; 
        console.log(foo); // 3,4,5
      }
    }
    

      在函数中使用var声明变量,避免作用域陷阱

    var foo = function() {
      var boo = function() {
        console.log(doo) // undefined 声明提升
        var doo = 2; 
      }()
      console.log(doo); // ReferenceError: doo is not defined. doo在boo作用域中
    }()
    
    var foo = function() {
      var boo = function() {
        doo = 2; 
      }()
      console.log(doo); // 2, doo在全局作用域中
    }()
    

      作用域链

    var sayHiText = 'hi';
    
    var func1 = function() {
      var func2 = function() {
        console.log(sayHiText); // 在作用域链中寻找变量:func2-->func1-->global
      }()
    }()

    /*---------分割线------------*/

    var x = false;
    var foo = function() {
    var x = false;
    var bar = function() {
    var x = true;
    console.log(x);
    }()
    }

    foo(); // true, 当作用域链最近位置查找到变量时,查找即结束

      函数定义时确定作用域,而非调用时确认

    var foo = 'head'
    var parentFun = function() { var foo = 'foo' return function() { console.log(foo) } } var nestedFun = parentFun(); nestedFun(); // foo, 返回的函数可以通过作用域链访问foo

    var otherFun = function() {
    var foo = 'other'
    nestedFun(); // foo, 作用域链 parentFun --> global
    }()

      闭包是由作用域链引起的

    var countUpFromZero = function() {
      var count = 0;
      return function() {
        console.log(count++);
      }
    }();
    
    countUpFromZero (); // 0
    countUpFromZero (); // 1
    countUpFromZero (); // 2
    

      深入了解闭包:http://jibbering.com/faq/notes/closures/

  • 相关阅读:
    HTTP请求下载文件格式
    MT7621 加 openWRT 用HTTP和远程服务器通信
    MT7621加 OPENWRT 移植MQTT(paho.mqtt.c) 进行数据的收发
    MT7621安装的openwrt出现无法删除文件的问题
    GAI_LIB = -lanl
    error: expected declaration specifiers or '...' before numeric constant void free(void *);
    environment variable 'STAGING_DIR' not defined
    ubuntu安装 make4.2
    gcc在root权限下查不到版本
    【原创】大叔经验分享(113)markdown语法
  • 原文地址:https://www.cnblogs.com/daqianduan/p/4384028.html
Copyright © 2020-2023  润新知