#### 閉包
如果一個函數的返回值是一個函數,并且該函數內部操作了外部函數變量,則該函數在外部執行時將會生成閉包。
```
var func = function() {
var i = 0;
return function() {
i++;
console.log(i)
}
}
var f = func();
f(); //1
f(); //2
```
```
for(var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i); //55555
})
}
//立即執行函數擁有內部作用域
//或者使用let創建內部作用域
for(var i = 0; i< 5; i++) {
(function(i) {
setTimeout(function() {
console.log(i); //01234
})
})(i)
}
```
形成閉包的原因就是函數內部可以訪問函數外部的變量,反之不可以,當var f = func()時,其實就是生成了內部函數的引用,使得func和內部函數均沒有被銷毀,因此f可以一直使用。
閉包的缺點:引用的存在導致垃圾回收機制不會將其回收。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
#### 垃圾回收機制
說到閉包,就會說到垃圾回收機制了:
垃圾回收器會周期性的檢查是否存在不再使用的變量并回收以釋放內存
* 標記清除,標記為進入環境(比如函數內部聲明了變量),標記為離開環境(比如函數執行結束)。當垃圾回收機制進行檢查的時候,把去除全局變量和閉包,剩下的標記為離開環境的變量刪除。
* 引用計數,低版本ie的bom和dom使用該方式。記錄每個值被使用的次數,當聲明了一個變量并將一個引用類型賦值給該變量的時候這個值的引用次數就加1,如果該變量的值變成了另外一個,則這個值得引用次數減1,當這個值的引用次數變為0的時候,說明沒有變量在使用,這個值沒法被訪問了,因此可以將其占用的空間回收
如何解決內存泄露?手動清除
```
function bindEvent(){
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
obj=null;
}
```
#### 判斷類型
```
typeof 'str' === 'string'`
'str'.constructor === String
Object.prototype.toString.call('str') === '[object String]'
```
#### 字符串
```
substr(a, b)從a開始長度為b
substring(a, b)從a開始到b-1結束,當a>b時ab互換
slice(a, b)同substring,當a>b時直接返回空
```
typeof 一般只能返回如下幾個結果:number,boolean,string,function,object,undefined。
#### 跨域
由于瀏覽器同源策略,凡是發送請求url的協議、域名、端口三者之間任意一與當前頁面地址不同即為跨域。跨域的本質時瀏覽器阻止了用戶獲取數據,其實后臺已經將數據返回給前端了。
* porxy代理,讓后臺去請求跨域的服務器,并將結果返回
* CORS跨域資源共享,后端人員在處理請求數據的時候,添加允許跨域的相關操作。
* jsonp,動態插入一個script標簽。瀏覽器對script的資源引用沒有同源限制,同時資源加載到頁面后會立即執行。
```
function testjsonp(data) {
console.log(data.name); // 獲取返回的結果
}
var _script = document.createElement('script');
_script.type = "text/javascript";
_script.src = "http://localhost:8888/jsonp?callback=testjsonp";
document.head.appendChild(_script);
```
jsonp的缺點是無法異常處理,我們可以使用定時器檢查請求是否異常
跨域的請求是不會攜帶cookie的,需要自己設置withCredentials為true并且后臺設置白名單(是否該使用類似cookies,authorization headers(頭部授權)或者TLS客戶端證書這一類資格證書來創建一個跨站點訪問控制請求)
數組去重方法
```
用一個臨時數組和indexof
```
```
[1,2,3,3].filter((v, i, s) => {return s.indexOf(v) === i})
```
```
[...new Set(arr)]
```
window.onload方法是在網頁中所有的元素(包括元素的所有關聯文件)完全加載到瀏覽器后才執行的。
$(document).ready() 方法可以在DOM載入就緒時就對其進行操縱,并調用執行綁定的函數。