Javascript ES6 Const可以在不允许的情况下进行更改

时间:2017-04-07 11:25:36

标签: javascript

我正在玩一些ES6,我们知道const值无法更改/重新分配。 在那种情况下,为什么允许改变?

    $db_result = $this->db->get("table_users"); // here default database connected
    $this->db1 = $this->load->database('db1', TRUE);    
    $db1_result = $this->db1->get("table_users")

4 个答案:

答案 0 :(得分: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');

答案 1 :(得分:1)

问题是你正在为你的函数创建一个新的局部变量。

您正在使用的速记功能如下全长:

   sayName = function(name) {
       console.log(name)
   }

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

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

这会尝试将新字符串分配给常量,然后将其记录到控制台。

答案 2 :(得分: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);
}

结果保持不变。

答案 3 :(得分:0)

有两种情况,const无法正常工作。

  • const对象文字。
  • 对象的const引用。