English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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変数の昇格の深い理解に関する記事は、編集者が皆さんに共有した全ての内容です。皆さんに参考になれば幸いですし、ナイアラガイドのサポートを多くお願いします。