js點點滴滴 二

2022-09-07 01:48:11 字數 1133 閱讀 5774

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型別。該型別保證能容納實現所建立...