問題如圖所示,重點為畫圈部分
在此函式前已定義var sitousu=0;
可這函式執行后sitousu卻沒變
真心求教
uj5u.com熱心網友回復:
打斷點跟一下,可能是你的條件不滿足,沒有執行c++這一步uj5u.com熱心網友回復:
因為你的全域變數c是基本型別的,是存在堆疊里的,你把c當前引數傳遞的時候,相當于把c重新賦值給了引數,所以在函式中無論c如何變化都不會影響全域的c。如果你想用引數傳遞方式在函式中改變全域變數,可以把全域變數c改成參考型別(如:array,object等)這些參考型別是存在堆里面的,當成引數傳遞時會把指向當前參考物件的指標賦值給引數。當在函式中改變這個引數時,改變的是這個指標所指向的物件(即物件的值),這個時候全域變數也會變。
總結:基本變數當引數傳值,函式中改變不影響原值;參考物件當引數傳值,函式中改變,原值會隨之改變。
uj5u.com熱心網友回復:
謝謝,你的回答給了很大的幫助,今天百度了很多參考型別的方法,嘗試了很多次還是不行。能不能請教下具體的操作方法,困擾我一整天的問題了,真心求教
uj5u.com熱心網友回復:
最簡單的方法是,把函式內的引數用return回傳,函式呼叫之后再對全域變數重新賦值為函式的回傳值。例如:
var num = 1;
function fun(c) {
c++;
return c;
}
num = fun(num);
alert(num);
uj5u.com熱心網友回復:
一個簡單的栗子:
// 基本型別--- number,string,boolean,null,undefined,symbol
let a = 1;
function changeA(val) {
val += 1;
};
console.log("a = " + a); // a = 1
changeA(a);
console.log("a = " + a); // a = 1
// 參考型別---array,object,function
let b = [1, 2, 3];
function changeB(arr) {
arr[0] = 4;
}
console.log(b) // [1, 2, 3]
changeB(b);
console.log(b) // [4, 2, 3]
uj5u.com熱心網友回復:
因為你的全域變數c是基本型別的,是存在堆疊里的,你把c當前引數傳遞的時候,相當于把c重新賦值給了引數,所以在函式中無論c如何變化都不會影響全域的c。
如果你想用引數傳遞方式在函式中改變全域變數,可以把全域變數c改成參考型別(如:array,object等)這些參考型別是存在堆里面的,當成引數傳遞時會把指向當前參考物件的指標賦值給引數。當在函式中改變這個引數時,改變的是這個指標所指向的物件(即物件的值),這個時候全域變數也會變。
總結:基本變數當引數傳值,函式中改變不影響原值;參考物件當引數傳值,函式中改變,原值會隨之改變。
謝謝,你的回答給了很大的幫助,今天百度了很多參考型別的方法,嘗試了很多次還是不行。能不能請教下具體的操作方法,困擾我一整天的問題了,真心求教
一個簡單的栗子:
// 基本型別--- number,string,boolean,null,undefined,symbol
let a = 1;
function changeA(val) {
val += 1;
};
console.log("a = " + a); // a = 1
changeA(a);
console.log("a = " + a); // a = 1
// 參考型別---array,object,function
let b = [1, 2, 3];
function changeB(arr) {
arr[0] = 4;
}
console.log(b) // [1, 2, 3]
changeB(b);
console.log(b) // [4, 2, 3]
十分感謝,大概懂了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/121905.html
標籤:JavaScript
上一篇:js dom 的常用屬性和方法
下一篇:微信小程式商城的必要的幾個頁面
