我正在玩弄一些ES6,我們知道常量值不能更改/重新分配。 在這種情況下,爲什麼允許改變?Javascript ES6常數可以在不允許的情況下更改
{
const name = 'unchangable';
sayName = (name) => {
console.log(name);
}
}
sayName('changed');
我正在玩弄一些ES6,我們知道常量值不能更改/重新分配。 在這種情況下,爲什麼允許改變?Javascript ES6常數可以在不允許的情況下更改
{
const name = 'unchangable';
sayName = (name) => {
console.log(name);
}
}
sayName('changed');
它沒有改變,你只是打印你傳遞給函數的值而不是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');
有兩種情況wher e const不能像你認爲的那樣工作。
問題是你正在爲你的函數創建一個新的局部變量。
您使用的是全長以下簡寫功能:
sayName = function(name) {
console.log(name)
}
名稱獲取函數內部產生,而不是從它的外拉。你應該用下面的運行代碼:
{
const name = 'unchangable';
sayName = (nameInput) => {
name = nameInput;
console.log(name);
}
}
sayName('changed');
這將嘗試新的字符串分配給你的常數,登錄到控制檯之後。
您需要了解範圍和閉包在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);
}
結果仍然相同。
in sayName函數名稱是一個局部變量,而不是你的const – Berrigan
你沒有改變你的變量,'console.log'接受了胖箭頭函數的參數,'name'仍然沒有改變 – Oskar