做用域&閉包

題目(答案見每題下方空白處)

  1.說一下對變量提高的理解閉包

  變量提高即JS的預解析,也就是var聲明的變量以及function開頭的函數聲明會在預解析時被提到整段代碼的最前面,變量賦值爲undefined,函數則直接爲本體app

  而函數中的預解析還包括arguments(形參)和this指向,arguments也會被初始化賦值爲undefined函數

  2.說明this幾種不一樣的使用場景this

  構造函數、對象屬性、普通函數、call/apply/bindspa

  3.建立10個a標籤,點擊每個彈出對應的序號對象

  (用閉包/let寫)blog

  4.如何理解做用域ip

  (關鍵點:自由變量、做用域鏈、閉包的兩個場景)作用域

  5.實際開發中閉包的使用開發

  閉包能夠用來收斂權限

 

知識點

執行上下文(預解析)

  執行上下文(預解析)針對一段script/一個函數

  全局中,提早拿出變量定義和函數聲明,給變量初始化爲undefined,函數則直接把函數本體丟到最前面

  函數中提早拿出變量定義、函數聲明、this和arguments,一樣給變量初始化爲undefined,函數也直接把本體丟到最前面去,this和arguments在函數執行前也都肯定了值

this

  this只有在執行時才能確認值,而定義的時候沒法確認

  this可使用在構造函數、對象屬性、普通函數、call、apply、bind方法中

  構造函數中的this,當實例化一個對象時,構造函數中的this指向這個構造函數自己,而若是直接調用構造函數,則this指向window

  

  

  對象的屬性中,this指向該對象

  

  普通函數中,this指向當前環境(window)

  

  call、apply和bind方法中,this指向第一個傳入的參數

  

做用域

  兩個最基礎的點

  1.JS中沒有塊級做用域(ES6的let和const添加了塊級做用域)

  2.只有全局做用域和函數做用域

塊級做用域

  ES6中新增的一個特性,對let和const聲明的變量,只在其聲明的塊級做用域中生效

  例以下方的兩個for語句,var聲明的會在循環結束後仍能夠訪問循環體中的變量,而let聲明的則不能夠訪問

  

做用域鏈

  在當前做用域未定義的變量稱之爲自由變量

  對於函數體內部的變量,若是在其函數做用域中未定義,則會往其父級做用域查找是否有定義,有則調用,不然繼續往上,直至全級做用域

閉包

  閉包是用來訪問函數做用域中的局部變量的

  具體使用場景有二:

  1.函數做爲返回值

  

  這裏返回100是由於f1返回的匿名函數定義的位置在f1中,而f1中的a的值爲100,外部的a是全局做用域的,跟匿名函數無關

  2.函數做爲參數傳遞

  

  這裏返回100是由於f1中的匿名函數定義在f1裏,能訪問到的是其定義時所處環境的a,因此爲100

十個li標籤的彈出問題

  1.能夠用閉包(自執行匿名函數)解決

  

  2.能夠用let的塊級做用域特性解決

  

實際開發中的應用

  閉包的特色在於,能夠訪問到函數做用域內部的局部變量,而局部變量是沒法在外部修改的(除非提供API)

  所以能夠利用這一特性,限制權限

  

  這裏的list是函數的局部變量,不能夠被修改,而函數只能用來記錄某個數據是否出現過

相關文章
相關標籤/搜索