簡體   English   中英

函數內部具有相同名稱的變量將更改所傳遞參數的值

[英]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具有自己的作用域。 但是它被修改了。 任何幫助,將不勝感激。

代碼中的變量xglobal 當您的方法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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM