js中變數含 引數 陣列 作用域傳遞問題

2022-08-30 07:03:15 字數 1967 閱讀 2264

js沒有塊級作用域(你可以自己閉包或其他方法實現),只有函式級作用域和全域性作用域,函式外面的變數函式裡面可以找到使用,函式裡面的變數外面無法訪問到。

寫這個是因為es6中的乙個例子開始的。首先看下例子

var a = ;

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

}a[6]();// 10

var a = ;

for (let i = 0; i < 10; i++) ;

}a[6]();// 6

這兩個例項的區別在於定義i的時候,迴圈先執行完後,等待呼叫執行的時候,i才會被賦值給函式體內,等於是迴圈先給陣列賦值完畢後。等待呼叫。而不是迴圈的時候就把i的值log出來!

兩個例子乙個用了var 乙個用let定義變數。 let是有塊級作用域,因此每次迴圈體的i都是不同且獨立的

上面**中,變數ivar命令宣告的,在全域性範圍內都有效,所以全域性只有乙個變數i

每一次迴圈,變數i的值都會發生改變,而迴圈內被賦給陣列a的函式內部的console.log(i),裡面的i指向的就是全域性的i。也就是說,所有陣列a的成員裡面的i,指向的都是同乙個i,不管是迴圈到第幾次,導致執行時輸出的都是最後一輪的i的值,也就是10。

var a=10

function aaa(a)

function bbb()

bbb();

//---結果輸出10  執行函式bbb 裡面會執行aaa() aaa裡面的alert 裡的a 尋找作用域,自身有區域性變數的話輸出自己,沒有的話去aaa的作用域找 上層的var a=10便是。

function aaa()

aaa(a)

執行過程貌似應該是

var a=10

function aaa(a)

aaa(a)

傳遞進來的10 賦給變數a alert(10) 之後var a=20 覆蓋了之前的10 ,但是函式沒有執行到這裡就alert結束了。再後面alert(a) //20

傳參時,基本型別傳值,引用型別傳引用。

var a = 5;

var b = a;

b +=3;

alert(a);//5

var a = [1,2,3];

var b=a;

b.push(4);

alert(a);//[1,2,3,4];

變數a 將5這個值傳給b  b 和a 沒有關係了。

陣列是引用傳遞,把b的指標也指向了 同乙個位址,所以b的改變 a也改變

var a = [1,2,3];

var b=a;

b=[1,2,3,4]

alert(a) //[1,2,3]

b 被重新賦值後,指標會從新指向自己的記憶體位址,脫離a。

此外,引數與變數的作用域是相似的:

var a=10;

function aaa(a)

aaa(30) //40

alert(a)//10

var a=[1,2,3]

function aaa(a){

var a=[1,2,3,4]

aaa(a)

alert(a)// [1,2,3]  函式裡面的a被重新賦值,和外層的a 不指向同乙個a

var a=[1,2,3]

function aaa(a){

a.push(4)

aaa(a)

alert(a)// [1,2,3,4]

引用改變新增元素後,指向同乙個a,引用傳遞指標,值也變了。

Python函式引數傳遞以及變數作用域

使用 號,表示函式接受多個引數 def f args print args f 1 1,f 1,2,3 1,2,3 f f 1,2 1,2 使用 號,表示傳遞的是字典引數 def f1 args print args f1 a 1,b 2 3.將函式名作為引數傳遞 coding utf 8 用來支援...

js中變數的作用域

變數定義 可以使用var定義變數,變數如果沒有賦值,那變數的初始值為undefined。全域性變數 全域性變數也稱為外部變數,定義在所有函式之外的變數,不屬於哪個函式。其作用域是整個源程式。區域性 函式級 變數 使用var定義在函式體內部的變數,只在函式內部有作用,他只能在定義他的函式中使用,超出函...

JS中for迴圈變數作用域

js中作用域只有函式作用域和全域性作用域,在函式體內使用var 定義的變數,會被提到函式開始處進行定義,作用域為整個函式,常見的誤區如下 1 var a 2for var i 0 i 10 i 5 6 a 0 78 其中,由於for迴圈並不是乙個函式體,所以for迴圈中定義的變數q和i是作用域for...