Javascript ES6 常量在不允许更改的情况下也可以被修改。

3

我正在研究一些ES6技术,我们知道const定义的变量不能被修改或重新赋值。 那么为什么还允许进行更改呢?

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

}

sayName('changed');

2
在 sayName 函数中,name 是一个局部变量,不是你的常量。 - Berrigan
1
你没有改变你的变量,console.log 接受的是箭头函数的参数,name 仍然没有改变。 - Oskar
4个回答

2

它并没有改变,你只是打印了传递给函数的值而不是 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');


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引擎将在本地作用域中搜索该变量。如果未找到,它将遍历建立在其上的所有作用域。
在我的先前示例中,如果fullNamesayFullName中未找到,则JS引擎将搜索在sayFirstName的作用域中声明的所有变量。如果在那里没有找到,它将搜索全局作用域,在浏览器中,它是window对象。如果变量在那里也找不到,就会抛出错误。
现在,在您的代码中,您在外部作用域中定义了一个const name。然后,您继续创建一个新函数sayName。这个函数有自己的作用域。其中声明的所有内容,包括参数,都是一个新的东西。
那么,当您执行以下操作时会发生什么:

console.log(name);

JS引擎看到了RHS操作,你试图将console.log的第一个参数的值设置为name。因此,它会搜索name。它首先要查找的是本地函数范围,即sayName的范围。因为你在参数列表中定义了它,所以它会在那里找到它。因此,它永远不需要在函数外部搜索,因此它永远找不到const name。
你可以像这样编写该函数:
sayName = (foo) => {
  console.log(foo);
}

结果保持不变。

0

有两种情况下,const 不会按照你想象的那样工作。

  • 一个 const 对象字面量。
  • 一个指向对象的 const 引用。

0
问题在于你正在为函数创建一个新的本地变量。
你正在使用的简写函数完整写法如下:
   sayName = function(name) {
       console.log(name)
   }

名称是在函数内部创建的,而不是从外部获取的。您应该使用以下代码运行您的代码:

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

这将尝试将新字符串分配给您的常量,并在之后将其记录到控制台。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接