js 閉包

概念:有權訪問兩一個函數作用域中的變量的函數--->能夠讀取其他函數內部變量的函數

function demo () {
    var top = '';
    function c() {
        xxx.innerHTML = top;
    }
}

閉包在工作中的使用:

1、封裝私有變量:(amd框架在使用)

(function () {
      var Person = function() {
        this.money = 100000000;
      }
      Person.prototype.buy = function () {
        this.money -= 100;
        console.log('left money ' + this.money + ' <br />');
      }

      let xiaoming = new Person();
      xiaoming.buy();

      // 這個時候,如果有個函數改變了xiaomign的money值,那麼money就是外面可以訪問的
      // 相當於一個對象它的屬性外部可以去改
      function xiaomingWifeSearch() {
        xiaoming.money = 0;
      }
      xiaomingWifeSearch();
      xiaoming.buy();

    })();

上面的問題可以用閉包來解決:

(function () {
      var Person = (
        function (params) {
          var _money = 100000000;
          function Person() {
            // 這裏放公有的變量
          }
          Person.prototype.buy = function () {
            _money -= 100;
            console.log('left money ' + _money + ' <br />');
          }
          return Person;
        }
      )()

      let xiaoming = new Person();
      xiaoming.buy();

      // 這個時候,如果有個函數改變了xiaomign的money值,那麼money就是外面可以訪問的
      // 相當於一個對象它的屬性外部可以去改
      function xiaomingWifeSearch() {
        xiaoming.money = 0;
      }
      xiaomingWifeSearch();
      xiaoming.buy();

    })();

但是上面的代碼依然存在問題:比如

(function () {
      var Person = (
        function (name) {
          var _money = 100000000;
          function Person(name) {
            // 這裏放公有的變量
            this.name = name
          }
          Person.prototype.buy = function () {
            _money -= 100;
            console.log(this.name + 'left money ' + _money + ' <br />');
          }
          return Person;
        }
      )()

      let xiaoming = new Person('xiaoming');
      xiaoming.buy();
      let xiaohong = new Person('xiaohong');
      xiaohong.buy();

    })();

所有對象公共一個屬性,var _money = 100000000; // ==> 靜態私有變量

2、存儲變量:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章