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可使用在構造函數、對象屬性、普通函數、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
1.能夠用閉包(自執行匿名函數)解決
2.能夠用let的塊級做用域特性解決
閉包的特色在於,能夠訪問到函數做用域內部的局部變量,而局部變量是沒法在外部修改的(除非提供API)
所以能夠利用這一特性,限制權限
這裏的list是函數的局部變量,不能夠被修改,而函數只能用來記錄某個數據是否出現過