2017-04-07 44 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); 
} 

结果仍然相同。

相关问题