2017-12-03 123 views
0

我有如下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)); 
 
}

預期輸出應該打印10次「11」,而是打印一次。儘管我沒有修改傳入的值,函數調用會更改x事件的值。函數內部的x有它自己的範圍。但它會被修改。任何幫助,將不勝感激。

+0

什麼是路過'x'在函數調用的目的,你從不在'modifyx使用'xvalue'()' – NewToJS

+0

這只是一個例子。實際上,我正在使用該值作爲我的函數中的「只讀」。問題是爲什麼會發生這種情況? –

+0

我只是想更好地理解你希望完成的事情,但我現在更好地理解你的問題。你只是想知道**你爲什麼得到輸出。 – NewToJS

回答

2

代碼中的變量xglobal。當您的方法modifyx(xvalue)第一次返回時,x的值已經是11,用於第二次迭代的for循環中。因此它無法進一步執行該方法。

for (x = 0; x < 10; x++)的聲明中使用let 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)); 
 
}

+0

謝謝!我實際上嚇壞了,並沒有意識到這個小錯誤。 –

+0

@BILALAHMAD,你是最受歡迎的。 – Mamun

2

只要把變種在這兩個地方在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爲你的代碼的全局變量。可變範圍

+0

我在最後一行右邊解釋了它。它將x作爲全局變量。因此x內部函數循環十次,並且函數外部的循環終止,因爲x的值因爲x相同而達到10。 – saiyan

0

MDSN文檔中的JavaScript:

JavaScript有兩個作用域:全局和局部。在函數定義之外聲明的變量 是一個全局變量,其值 可在整個程序中訪問和修改。在函數定義中聲明的變量 是本地的。它創建 和銷燬每次函數執行


當使用關鍵字var時間,它的範圍(功能)的變量聲明被拉到頂部。

在您的示例代碼中,您使用的for循環沒有定義var x。當您使用for (x = 0...時,瀏覽器假定您的意思是for (var x = 0...,因此它會創建一個名爲x的全局變量。

在你的函數modifyx中,你將globalx設置爲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++) { ... } 
相關問題