我正在研究一些ES6技术,我们知道const定义的变量不能被修改或重新赋值。 那么为什么还允许进行更改呢?
{
const name = 'unchangable';
sayName = (name) => {
console.log(name);
}
}
sayName('changed');
我正在研究一些ES6技术,我们知道const定义的变量不能被修改或重新赋值。 那么为什么还允许进行更改呢?
{
const name = 'unchangable';
sayName = (name) => {
console.log(name);
}
}
sayName('changed');
它并没有改变,你只是打印了传递给函数的值而不是 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');
你需要理解JavaScript中作用域和闭包的工作原理。
每次创建函数时,实际上都会创建一个新的作用域级别。在该函数内部声明的所有内容都可以被该函数以及其中定义的任何其他函数访问。例如:
function sayFirstName(firstName) {
//This function can access firstName
function sayFullName(fullName) {
//This function can access firstName and fullName
console.log(firstName, fullName);
}
}
fullName
在sayFullName
中未找到,则JS引擎将搜索在sayFirstName
的作用域中声明的所有变量。如果在那里没有找到,它将搜索全局作用域,在浏览器中,它是window
对象。如果变量在那里也找不到,就会抛出错误。const name
。然后,您继续创建一个新函数sayName
。这个函数有自己的作用域。其中声明的所有内容,包括参数,都是一个新的东西。console.log(name);
sayName = (foo) => {
console.log(foo);
}
有两种情况下,const 不会按照你想象的那样工作。
sayName = function(name) {
console.log(name)
}
名称是在函数内部创建的,而不是从外部获取的。您应该使用以下代码运行您的代码:
{
const name = 'unchangable';
sayName = (nameInput) => {
name = nameInput;
console.log(name);
}
}
sayName('changed');
这将尝试将新字符串分配给您的常量,并在之后将其记录到控制台。
console.log
接受的是箭头函数的参数,name
仍然没有改变。 - Oskar