我正在玩弄一些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