2017-04-07 9 views
3

私はいくつかのES6で遊んでおり、const値を変更/再設定できないことがわかりました。 その場合、なぜ変更が許可されますか?Javascript ES6 Constは許可されていないときに変更することができます

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

} 

sayName('changed'); 
+2

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

2例wherがあります。あなたが思うように、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オペランド(つまり=の右側の値です)、その変数を見たびに、文字列、数、機能、などが、Aのように見えるものではありません変数名の場合、JSエンジンはその変数をローカルスコープで検索します。見つからなければ、その上に構築されているスコープをすべてトラバースします

が見つからない場合はJSエンジンが検索しますすべての変数はsayFirstNameのスコープの中で宣言されています。そこに見つからなければ、グローバルスコープを検索し、ブラウザではwindowオブジェクトです。変数がそこに見つからない場合は、エラーがスローされます。

あなたのコードでは、外側の範囲にconst nameを定義します。次に、新しい機能、sayNameを作成します。この関数は独自のスコープを持ちます。議論を含めて、その中に宣言されたすべてが新しいものです。あなたがこれを行うとき

だから何が起こる:

console.log(name);

JSエンジンはRHSの操作を見て、あなたはnameからconsole.logの最初の引数の値を設定しようとしています。したがって、nameを検索します。最初に見えるのはローカル関数のスコープで、それはsayNameです。あなたが引数リストに定義しているので、それを見つけることになります。したがって、あなたの関数の外で検索する必要はありませんので、const nameは決して見つかりません。

sayName = (foo) => { 
    console.log(foo); 
} 

結果は同じまま:

あなたにもこのような関数を書くかもしれません。

関連する問題