2017-01-12 2 views

答えて

9

グローバル変数locationを定数として再定義することはできません。 let [{location}] = companiesを使用した場合、エラーは発生しませんでしたが、値をwindow.locationに割り当ててページをリダイレクトしようとすると、間違った動作をしたことになります。

考えられる解決策:

  • 変更(プロパティ名と一緒に)変数名
  • ブロックでコードをラップ(私たちはES6を使用しているため、生命維持、この場合には必要ありません)
  • あなたは

const companies = [ 
 
    {name: 'Google',loc: 'Mountain View'}, 
 
    {name: 'Facebook', loc: 'Menlo Park'}, 
 
    {name: 'Uber', loc: 'San Francisco'} 
 
]; 
 

 
const [{loc}] = companies; 
 
console.log(loc); 
 

 
// Block scope 
 
{ 
 
    const companies = [ 
 
    {name: 'Google', location: 'Mountain View'}, 
 
    {name: 'Facebook', location: 'Menlo Park'}, 
 
    {name: 'Uber', location: 'San Francisco'} 
 
    ]; 
 
    const [{location}] = companies; 
 
    console.log(location); 
 
} 
 

 
// Variable name doesn't have to be the same as property 
 
const [{ location: loca }] = [{location: 'Mountain View'}] 
 
console.log(loca);
最後の例を参照して、プロパティ名を維持し、変数名を変更することができます

+1

"グローバル変数Xを再定義することはできません"という文を明確にすると、一般的には同じスコープの定数にのみ適用されます。 – Zorgatone

+0

私はあなたが意味するものを得ることはできませんが、より多くの 'var'の同じ宣言を書くことができます。私が言ったことで何が間違っていますか、そしてどのようなコードがあなたにそのエラーを与えていますか? OPは、 '会社'変数ではなく、 '場所'変数に問題があります。 – Zorgatone

+0

よろしくお願いします。コードを追加しました。私は最初にそれを読むことができます – Zorgatone

-3
const companies = [ 
    { name: 'Google', location: 'Mountain View' }, 
    { name: 'Facebook', location: 'Menlo Park' }, 
    { name: 'Uber', location: 'San Francisco' } 
]; 

console.log(companies[0].location); 
4

ここでの問題は、あなたが関数内のコードをラップしていないということです。

IIFE(Immediately Invocated Function Expression)を使用する場合、同じコードが機能します。

あなたのコードが失敗する理由は、定数/変数名がすでに使用されている場合、同じスコープ内で定数を宣言できないためです。

constの代わりにvarを使用しましたが、それはwindow.locationに割り当てられ、効果的にページをリロードし、そのURLが存在しないため、404ページになります。

グローバル名空間の汚染や修正が困難な厄介なバグを防ぐために、コードを常にIIFEで記述する必要があります。いっそ

(() => { // ES2015 IIFE 
 
    "use strict"; 
 
    
 
    const companies = [ 
 
     { name: 'Google', location: 'Mountain View' }, 
 
     { name: 'Facebook', location: 'Menlo Park' }, 
 
     { name: 'Uber', location: 'San Francisco' } 
 
    ]; 
 
    
 
    const [{ location }] = companies; 
 
    console.log(location); 
 
})();

または::

は、ここで同じ生命維持(追加strictモード)とのコードだ

{ // ES2015 block 
 
    "use strict"; 
 
    
 
    const companies = [ 
 
     { name: 'Google', location: 'Mountain View' }, 
 
     { name: 'Facebook', location: 'Menlo Park' }, 
 
     { name: 'Uber', location: 'San Francisco' } 
 
    ]; 
 
    
 
    const [{ location }] = companies; 
 
    console.log(location); 
 
};

のTh ES2015ブロックの電子の使用は、すべてのブラウザがまだES2015構文をサポートしているわけではないことを覚えて、常に、あなたはまた、

のみletconstを使用して(とvarを使用していない)ことがありますことを考えると、グローバルスコープを汚染しません。したがって、コードはBabel JSまたは同様のツールを使用してトランスバイルされなければなりません。

+0

彼の答えは – Zorgatone

+0

OPによると、Juan Mendesとコードを議論した後に返答しました。「最初の要素の位置属性を取得したい:」estusのコメントにも注意してください、ブロックはES6以降使用する必要があります –

+0

あなたが正しい。私はその1つを逃した – Zorgatone

0

locationは既にグローバルスコープでwindow.locationと宣言されているためです。

これを回避するには、このコードをローカルスコープ、つまりブロックで実行しないでください。これはES6ですが、IIFEはES5の残しです。

{ 
    ... 
    const [{ location }] = companies; 
} 

典型的なES6の使用はモジュラー環境です。現在のスコープがCommonJSまたはES6モジュールであることを考慮すると、問題は決して現れません。

+0

ES2015ブロックスコープ内の 'var'は、とにかくグローバルスコープを汚染することに注意してください'const'と' let'だけを使うようにしました – Zorgatone

+0

@Zorgatoneこれは正しいです。一般的には、 'var'を使用しない方が良い方法です。なぜなら、それが解決するよりも多くの問題を作り出すからです。この理由から、ESLintには 'no-var'ルールがあります。 – estus

+0

私はちょうどそのことを書き留めるようにコメントしました。実際、ES6では 'const'と' let'だけを使うのが良い方法です。しかし、グループ内で作業するときや、他のソースから 'var'を含まないことをチェックせずにコードをコピーして貼り付けるときは注意してください。同じ変数が複数回宣言されていない場合は' let'と置き換えてください – Zorgatone

関連する問題