English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

jsの変数昇格を深く理解する

JavaScriptの関数定義には、関数体の全ての文をスキャンし、すべての宣言された変数を関数のトップに「昇格」させるという特徴があります:

'use strict';
function foo() {
  var x = 'Hello, '; + y;
  alert(x);
  var y = 'Bob';
}
foo();

strictモードではありますが、文var x = 'Hello, '; + y;がエラーを報告しませんが、これは変数yが後に宣言されたためです。しかし、alertはHello, undefinedを表示し、変数yの値がundefinedであることを示しています。これは、JavaScriptエンジンが自動的に変数yの宣言を昇格させますが、変数yの代入は昇格されないためです。

上記のfoo()関数に関して、JavaScriptエンジンが見るコードは以下のようになります:

function foo() {
  var y; // 変数yの宣言を昇格させます
  var x = 'Hello, '; + y;
  alert(x);
  y = 'Bob';
}

JavaScriptがこの奇妙な「特性」があるため、関数内で変数を定義する際には、「関数内でまずすべての変数を宣言する」というルールを厳守してください。最も一般的な方法は、関数内で使用するすべての変数を宣言するためにvarを使用することです:

function foo() {
  var
    x = 1, // xが初期化されます1
    y = x + 1, // yが初期化されます2
    z, i; // zとiがundefined
  // 他の文:
  for (i=0; i<100; i++) {
    ...
  }
}

このjs変数の昇格の深い理解に関する記事は、編集者が皆さんに共有した全ての内容です。皆さんに参考になれば幸いですし、ナイアラガイドのサポートを多くお願いします。

基礎教程
おすすめ