1.靜態作用域與動態作用域
作用域是指程式原始碼中定義變數的區域.
作用域規定了如何查詢變數,野牛是確定當前執行**對變數的訪問許可權.
j**ascript 採用詞法作用域(lexical scoping),也就是靜態作用域.
靜態作用域:函式的作用域在函式定義的時候就決定了.
動態作用域:函式的作用域是在函式呼叫的時候才決定的.
var v = 1;function
foo()
function
faa()
faa();
//1;
兩種假設,當 j**ascript 採用靜態作用域,會執行以下過程:
執行 foo 函式,先從foo函式內部查詢是否有區域性變數 v ,如果沒有,就根據書寫的位置,查詢上面一層的**,也就是v等於1,所以會列印1;
當 j**ascript 採用動態作用域:
執行 foo 函式,依然是從 foo 函式內部查詢是否有區域性變數 v ,如果沒有就從呼叫函式的作用域,也就是 faa 函式內部查詢 v 變數,所以結果會是2;
因為 j**ascript 採用的是靜態作用域,所以這個例子的結果是1;
下面是乙個《j**ascript權威指南》中的例子:
var scope = "global scope";function
checkscope()
return
f();
}checkscope();
var scope = "global scope";function
checkscope()
returnf;}
checkscope()();
兩端**都會列印: local scope
原因很簡單,因為 j**ascript 採用的靜態作用域(詞法作用域),函式的作用域基於函式建立的位置
而《j**ascript權威指南》的回答是:
j**ascript 函式的執行用到了作用域鏈,這個作用域鏈是在函式定義的時候建立的。巢狀的函式 f() 定義在這個作用域鏈裡,其中的變數 scope 一定是區域性變數,不管何時何地執行函式 f(),這種繫結在執行 f() 時依然有效。
js點點滴滴 一
1.break和continue搭配標籤使用 以前只知道break能夠跳出迴圈,continue是結束本次迴圈,其實,break和continue還有一種不同的使用方法 搭配標籤使用,即break 標籤名 continue 標籤名 先來寫乙個結束本次迴圈的demo var arr new array...
acm 點點滴滴
qsort排序方法 六種qsort排序方法 本文中排序都是採用的從小到大排序 一 對int型別陣列排序 int num 100 sample int cmp const void a const void b qsort num,100,sizeof num 0 cmp 二 對char型別陣列排序 ...
sizeof 點點滴滴
1.靜態變數是存放在全域性資料區中的,sizeof計算棧中分配的大小,所以類或結構體中的靜態變數時不會計算在sizeof內的!2.sizeof和strlen的區別 1 sizeof操作符的結果型別是size t,它在標頭檔案中的typedef為unsigned int型別。該型別保證能容納實現所建立...