前言:和大多數程式語言一樣,js也採用詞法作用域,即函式的執行依賴於變數作用域,這個作用域是在函式定義時決定的,而不是函式呼叫時決定的。函式物件可以通過作用域鏈關聯起來,函式體內部的變數都可以保持在函式作用域內,這種特性在計算機文獻中被稱之為閉包
(含義是指函式變數可以被隱藏於作用域鏈之內,因此看起來函式將變數包裹起來了)。
首先我們先來看一段**:
var scope = 'global scope' //全域性變數
function checkscope();
return f() //返回f執行結果
};checkscope(); //執行結果 local scope;
這段**很容易看懂,在呼叫checkscope的時候,該函式內部把f的執行結果返回;
下面我們把上面的**稍加改造:
var scope = 'global scope' //全域性變數
function checkscope();
return f //返回f執行結果
};checkscope()(); //執行結果 local scope;
現在在呼叫checkscope的時候返回的僅僅是乙個函式物件,此時在checkscope外部呼叫這個函式物件,那麼他裡面的返回結果還是local scope而不是global scope;
原理:js的執行用到了作用域鏈,這個作用域鏈是在函式定義時建立的。巢狀函式f定義在這個作用域鏈裡,其中的scope一定是區域性變數,不管任何時候執行f,這種繫結在執行f的時候依然有效。(閉包的這種特性強大到讓人吃驚,它們可以捕捉到區域性變數(和引數),並一直儲存下來)。
javacript深入淺出 閉包
簡單的對閉包做乙個理解 在看閉包之前我們還需要理解作用域。作用域主要分為兩種 全域性變數和區域性變數。複製 全域性變數 區域性變數 區域性變數 只能用於定義它函式內部。對於其他的函式或指令碼 是不可用的。這裡定義的n就是區域性變數。function mytest1 console.log n n i...
深入淺出通訊原理知識點1
前面部分講的太基礎了,所以從1.5節開始 發信機和收信機對訊號所作的處理如圖 對於模擬信源,一般先進行模 數轉換,將模擬訊號數位化,再進行壓縮編碼,盡量剔除冗餘,減少對傳輸頻寬的占用。通道編碼是通過新增冗餘資訊,以便在接收端進行糾錯處理,解決通道的雜訊和干擾導致的誤碼問題。為了解決連續誤碼問題,需要...
深入淺出通訊原理知識點7
通道編碼與交織在通訊系統中的位置 通道編碼的引入主要是為了解決資料在通道中傳輸時引入的誤碼問題。解決誤碼問題有兩個辦法 接收端在發現誤碼後,請求傳送端對錯誤資料進行重傳,稱為後向糾錯。arq就是一種後向糾錯演算法。傳送端在傳送資料時加入一定的冗餘資訊,以便在出現誤碼時接收端可以直接進行糾錯,稱為前向...