函式的作用域

2021-09-02 12:47:37 字數 2328 閱讀 1009

一,每乙個變數都是有作用域的。

1,首先講一下**塊與作用域:for, if等語句還有

function,他們都有乙個特點,就是後面有一對{}比如

for(var i = 0; i < items.length; i++)」之間有**

}if(some_express)」之間有**

}function(param1)」之間有**

}

所有{}包起來的**,都可以稱之為 

「**塊」

, 英文名叫block。

每個**塊都有乙個自己的作用域,作用域決定了變數能否被訪問(不論讀取變數還是修改變數)。

訪問的規則大概是這樣的:

[1] 在最上層沒有任何{}包裹的作用域為頂層作用域,宣告的變數是**都可以訪問的,如:

var x = 5;

if(x>0)

function print_x()

[2] 任何乙個**塊,{}之間的**區域稱之為它的作用域,每一對大括號括起來的**塊裡宣告的變數,只能在這個**塊的作用域裡訪問,不過在js裡是不具備這個能力的。 但是為了建立起正確的思維觀,我們還是要講講塊級作用域。雖然語言不支援,但我們人不要跨越塊級作用域,這是乙個基本素質,會極大的減少bug發生率。

if(true) 

console.log(x); //其他語言裡無法訪問,但是在js裡可以

[3] **塊是有層級的,在乙個**塊裡寫的新的**塊,後者是前者的子作用域

if(true)

}

[4] 子作用域可以訪問父作用域的變數,但是父作用域無法訪問子作用域的變數

if(true)

console.log(y); //不應該在這裡再訪問了。

}

[5] 作用域的父級的父級作用域的變數,該作用域裡也可以訪問,甚至無窮多級父的作用域裡的變數都可以被訪問,這種無窮多級的父,被稱之為祖先

if(true)

}}

[6] 頂層作用域是所有作用域的祖先

2,函式的作用域

函式比起if,for等**塊有乙個顯著地不同,就是他可以在引數列表裡宣告變數

function a(param1, param2)

在父作用域宣告的變數,也可以在函式內被訪問

var x = 5;

function a(param1)

關於

作用域的覆蓋問題,當子作用域有變數與父作用域重名的時候,在子作用域裡只能訪問到子作用域的變數。稱之為 

覆蓋。

var x = 5;

function a(x)

a(6); //列印的是6

console.log(x); //列印的是5

所以,子作用域的覆蓋不會消除父作用域的變數

var x = 5;

function a(x)

a(6); //列印的是6

console.log(x); //列印的是5

例如:

var x = 5;

function a(x)

console.log(x);

}a(1);

console.log(x);

**的最後一行輸出結果是5.

//因為覆蓋並不會改變父作用域的變數。

3,要注意一些容易犯的錯誤:

for(var i = 0; i < 3; i++)

console.log(result); //有的初學者以為這裡會列印 [0,1,2],實際上會列印[2],因為result是在for裡面被定義的, 每次迴圈都被重新初始化了

關於覆蓋也是容易出錯誤:

var x = 0;

function fun()

fun();

我們想先用一下全域性變數x,然後再在子作用域裡宣告乙個重名的區域性變數x。結果我們會發現console.log()列印出的是 undefined。 因為js雖然是解釋執行的,但是在乙個作用域裡宣告的變數在這個作用域裡只有乙個指向,即便還沒有執行到正式宣告的哪一行,父級作用域的變數也已經因覆蓋無法訪問了

二,為了避免一些不必要的錯誤,我們在書寫**的時候要注意規範命名,養成好的習慣,提高寫**的效率。

函式的作用域

在php中,函式的作用域來控制函式及函式中的變數在 是可見並且可用的。不同的程式語言有不同的變數作用域規則,php中的函式及函式中的變數作用域規則如下 函式的作用域是指在函式內部宣告的變數作用域是從宣告的那條語句開始到函式的末尾 全域性作用域是指在函式外部宣告的變數作用域是從那條語句開始到宣告所在的...

函式的作用域

函式的作用域 今天給大家分享一下函式裡面關於作用域這塊內容,它也是很重要的一塊內容哦。首先,我先來說一說什麼是作用域。作用域就是乙個變數可以生效的範圍,乙個變數他不是在所有的地方都可以使用的,而這個變數的使用範圍就是它的作用域。一 作用域分為全域性作用域和區域性作用域。1.全域性作用域 全域性作用域...

函式作用域

有巢狀函式的時候有return x的返回函式x的位址,沒有的則為none def f1 n1 f1 print f1中 n1 def f2 n2 f2 def f3 n3 f3 print f3中 n3 print f2中 n2 return f3 return f2 r1 f1 print r1 ...