[英]Variable with same name inside function changes the value of the passed parameter
我有一個JavaScript函數,如下所示:
function modifyx(xvalue) { val = 1; for (x = 0; x < 10; x++) { val = val + 1; } return val; }
並且主代碼片段將名為x的變量傳遞給上述函數,如下所示:
for (x = 0; x < 10; x++) { console.log(modifyx(x)); }
預期的輸出應該是“ 11”打印10次,但它打印一次。 即使我沒有修改傳遞的值,該函數調用也會更改x的值。 函數內部的x具有自己的作用域。 但是它被修改了。 任何幫助,將不勝感激。
代碼中的變量x
是global
。 當您的方法modifyx(xvalue)
第一次返回時, x
的值已經是11,該值在for循環中用於第二次迭代。 因此,它無法進一步執行該方法。
在for (x = 0; x < 10; x++)
的聲明中使用let x
for (x = 0; x < 10; x++)
創建一個唯一的執行環境。
function modifyx(xvalue) { val = 1; for (x = 0; x < 10; x++) { val = val + 1; } return val; } for (let x = 0; x < 10; x++) { console.log(modifyx(x)); }
只需將var放在for循環的兩個位置
function modifyx(xvalue) {
val = 1;
for (var x = 0; x < 10; x++) {
val = val + 1;
}
return val;
}
for (var x = 0; x < 10; x++) {
console.log(modifyx(x));
}
因為它在代碼中將x作為全局變量。
有關JavaScript中可變范圍的MDSN文檔:
JavaScript具有兩個范圍:全局和本地。 在函數定義之外聲明的變量是全局變量,並且其值可在整個程序中訪問和修改。 在函數定義內聲明的變量是局部變量。 每次執行函數時都會創建並銷毀它
當使用var
關鍵字時,變量聲明被拉到其作用域(函數)的頂部。
在示例代碼中,您使用的是for循環而未定義var x
。 當您使用for (x = 0...
,瀏覽器會假定您的意思for (var x = 0...
因此它將創建一個名為x的全局變量。
在您的函數modifyx
內部,您要在執行結束時將全局 x
設置為11。 這導致外循環僅運行一次,因為x在第一個循環之后不再小於10。
這是注釋發生情況的示例:
function modifyx(xvalue) {
val = 1;
for (x = 0; x < 10; x++) { // sets the global 'x' to 11 after loop finishes
val = val + 1;
}
return val;
}
// 'x' is being defined as a global variable
for (x = 0; x < 10; x++) {
console.log(modifyx(x)); // modifyx sets 'x' to 11
// x is now 11, loop will now quit
}
一個簡單的解決方案是在兩個循環中使用let
關鍵字,從而限制了范圍。
for (let x = 0; x < 10; x++) { ... }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.