私はいくつかのES6で遊んでおり、const値を変更/再設定できないことがわかりました。 その場合、なぜ変更が許可されますか?Javascript ES6 Constは許可されていないときに変更することができます
{
const name = 'unchangable';
sayName = (name) => {
console.log(name);
}
}
sayName('changed');
私はいくつかのES6で遊んでおり、const値を変更/再設定できないことがわかりました。 その場合、なぜ変更が許可されますか?Javascript ES6 Constは許可されていないときに変更することができます
{
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');
2例wherがあります。あなたが思うように、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オペランド(つまり=
の右側の値です)、その変数を見たびに、文字列、数、機能、などが、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);
}
結果は同じまま:
あなたにもこのような関数を書くかもしれません。
sayName関数名は、あなたのconstではなく、ローカル変数です – Berrigan
あなたは変数を変更していません、 'console.log'は太字の矢印関数の引数をとります。' name'は変わりません – Oskar