2017-04-07 42 views
3

我正在玩弄一些ES6,我們知道常量值不能更改/重新分配。 在這種情況下,爲什麼允許改變?Javascript ES6常數可以在不允許的情況下更改

{ 
    const name = 'unchangable'; 
    sayName = (name) => { 
    console.log(name); 
    } 

} 

sayName('changed'); 
+2

in sayName函數名稱是一個局部變量,而不是你的const – Berrigan

+1

你沒有改變你的變量,'console.log'接受了胖箭頭函數的參數,'name'仍然沒有改變 – Oskar

回答

3

它沒有改變,你只是打印你傳遞給函數的值而不是const name

例子:

{ 
 
    const name = 'unchangable'; 
 
    sayName = (newName) => { 
 
    name = newName; // This will make an error 
 
    } 
 

 
} 
 

 
sayName('New Name')

如果你的代碼是相同的代碼打擊

{ 
 
    const name = 'unchangable'; 
 
    sayName = (someName) => { 
 
    // There is no relationship between `someName` and the const `name` 
 
    console.log(someName); 
 
    } 
 

 
} 
 

 
sayName('New Name');

0

有兩種情況wher e const不能像你認爲的那樣工作。

  • const對象字面量。
  • 對對象的const引用。
1

問題是你正在爲你的函數創建一個新的局部變量。

您使用的是全長以下簡寫功能:

sayName = function(name) { 
     console.log(name) 
    } 

名稱獲取函數內部產生,而不是從它的外拉。你應該用下面的運行代碼:

{ 
    const name = 'unchangable'; 
    sayName = (nameInput) => { 
    name = nameInput; 
    console.log(name); 
    } 
} 
sayName('changed'); 

這將嘗試新的字符串分配給你的常數,登錄到控制檯之後。

1

您需要了解範圍和閉包在JavaScript中的工作方式。

每次創建一個函數時,您都會創建一個新的作用域。一切宣佈裏面的功能可以通過該功能和其中定義的每個其他功能。例如,」

function sayFirstName(firstName) { 
    //This function can access firstName 
    function sayFullName(fullName) { 
     //This function can access firstName and fullName 
     console.log(firstName, fullName); 
    } 
} 

每次JavaScript引擎看到的RHS操作數(即在=右邊的值)和變量不是字符串,數字,功能等,但東西,看起來像一個變量名,JS引擎將搜索在局部範圍內是可變的。如果沒有找到,它會遍歷建立在該

頂在我前面的例子中所有範圍,如果fullName未發現內sayFullName JS引擎會搜索在sayFirstName範圍內聲明的所有變量,如果沒有找到,它將搜索全局範圍,在瀏覽器中它是window對象。如果在那裏找不到變量,則拋出錯誤。

現在,在您的代碼中,您可以在外部範圍中定義一個const name。然後你繼續創建一個新功能,sayName。這個函數有它自己的範圍。在它內部宣佈的一切,包括論點都是一件新事物。

console.log(name);

的JS引擎看到的RHS操作,您試圖console.log的第一個參數的值設置爲name

,當你這樣做會發生什麼。所以它搜索name。首先看到的是本地功能範圍,即sayName。它會在那裏找到它,因爲你在參數列表中定義了它。所以它永遠不會搜索你的功能,所以它永遠不會找到const name

你還不如寫這樣的功能:

sayName = (foo) => { 
    console.log(foo); 
} 

結果仍然相同。

相關問題