一.js高級(6)-閉包-定時器-js中代碼執行順序


閉包1:嵌套的兩個作用域中 內層作用域訪問外層作用域 局部變量的 過程

閉包2 :  就是能夠訪問其他函數內部變量的函數;

    由於js中只有函數內部的子函數才能訪問局部變量,所以可以簡單的把閉包理解為"定義在函數內部的函數";

    本質上閉包就是連接函數內部和外部的一座橋梁;

 

 閉包的作用:可以讓我們利用函數的作用域保存一些我們需要的變量 

      1.可以解決定時器中無法保存變量的問題  2.節約代碼量

 

閉包特點:延展了函數的作用域  (可以在函數外部讀取成員函數內部)

     閉包函數不會被輕易釋放 (讓函數始終存活在內存中)

閉包的缺點: 占用內存

 

//j定時器

for(var i=0; i<3; i++){

    setTimeout(function(){
        console.log(i);
    },0)
} // 4 4 4 4

瀏覽器執行代碼順序:  先執行棧中的代碼, 再執行任務隊列中的代碼

  執行棧:  script 標簽中的代碼

  任務隊列:  定時器中的函數代碼   綁定的事件函數代碼

所以, 定時器中的代碼要等到 for循環完成之后再執行

 

//閉包中 this 的指向問題
var
name = "The Window"; var obj = { name: "My Object", getNameFunc: function () {  return function () {    return this.name;   };   }    }; console.log(obj.getNameFun()() ); //the window

//1. 定義變量 that 來存儲 this的值
var obj = {
  name = 'the pbj',
  getNameFunc: function () {
      var that = this;  return function () {    return that.name;   };   }

  };
console.log(obj.getNameFun()() ); //the obj
//2. 利用bind(this), 將this指向obj

var object = {    
  name: "My Object",
  getNameFunc: function () {
    return function () {
      return this.name;
    }.bind(this);
   }
 };
console.log(object.getNameFunc()()); //the obj

 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM