いつ、どこでJavascriptの巻き上げを使用するべきか[終了]


11

私はJavaScriptが初めてです。Javascriptでの巻き上げの概念を学んでいます。Mozillaウェブサイトの
Javacsriptチュートリアルに基づいて、私はこの言葉に出くわしました。それらのチュートリアルによると、JavaScriptの変数は、例外を発生させることなく、後で宣言された変数を参照できるということです。しかし、私の質問は、クライアント側のJavascriptでホイストを使用することが適切なのはどのような状況なのか、またはなぜJavascriptでホイストを使用する必要があるのか​​ということです。その利点は何ですか。hoisting


1
あなたの研究を共有することは皆を助けます。何を試したか、なぜそれがニーズを満たしていないかを教えてください。これは、時間をかけて自分自身を助けようとしたことを示しており、明白な答えを繰り返すことから私たちを救い、そして何よりも、より具体的で関連性のある答えを得るのに役立ちます。また、質問する方法を
gnat

6
@gnat調査の結果、このトピックを理解していたら、コンセプトを適切に議論および理解するために、なぜこの質問をここに投稿したのでしょうか
Rudra

2
@Rudraこれはディスカッションフォーラムではありません。さらに、あなたが実際にこれを研究したという証拠を示していません。
Doval 2014年

5
はい。ただし、質問するための要件ではありません。
Robert Harvey

2
@Rudra:ディスカッションフォーラムではないことに注意してください 私たちは実際にはQ&Aサイトです。ここで尋ねられる質問は、Q&A形式内で合理的に回答できる範囲にすべきです。
Robert Harvey

回答:


11

「巻き上げ」という言葉は聞いたことがありません。このベンチェリーの巻き上げの使用法を参照している場合:http : //www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html、私が収集できることから、彼は単にJavaScriptからDouglas Crockfordをエコーし​​ています:良い部品であり、巻き上げを使用してはならない ということです。彼の最後の主張は、すべての変数は関数の上部で宣言する必要があるというものです(CrockfordとJSLintが示唆しているように)。

あるいは、ChristopherBrown氏の言葉では、これは使用する機能ではなく、ブラウザがJavascriptを解釈する方法に関連する奇妙な点です。

つまり、簡単に言うと、決してどこにありません


1
それでは、なぜこのコンセプトが含まれているのですか、そしてこの機能は何ですか?
Rudra

@Rudra:Davidがリンクした記事のサブトピック「Declarations、Names、and Hoisting」は、これをかなりうまくカバーしているようです。どの部分が不明確ですか?
Robert Harvey

@RobertHarvey私が知りたいのは、いつ、どこでこれを使用するかです。デビッドはそれが決してどこにも使用されていないと言いますが、なぜそれが機能として表示されるのですか
Rudra

4
機能があるからといって、それが良いアイデアであるとは限りません。「機能」が支持されなくなる理由はたくさんあります。あなたの付録でさえ、おそらく洞窟人の時代には役立っていたとしても、明らかに有用な目的は果たしていません。
Robert Harvey

1
巻き上げは、コンパイラー理論、特に最適化からの用語です。それは少なくとも20年間存在しますが、Javascriptのこの特殊性により人気を博しました。機能と呼ばれなかった場合、それはおそらくバグです。
david.pfx 2014年

16

ホイストは、ブラウザがJavaScriptをどのように解釈するかを示す機能であり、それほど使用される機能ではありません。

JavaScriptを解釈するとき、ブラウザーは関数レベルの変数を関数の先頭にスコープします。例:

function AddTwoAndTwo() {
    var two = 2;
    var result = two + two;
    return result;
}

ポストされたコードでは、関数スコープの先頭に「2」と「結果」の両方の変数が存在します(明らかに、変数がそこで宣言されているためです)。ただし、ブラウザーが変数を「巻き上げ」ているため、以下は正当なJavascriptコードになります。

function AddTwoAndTwo() {
    result = 5;
    alert(result);
    var two = 2;
    var result = two + two;
    return result;
}

ここでの最終的な効果は、変数を宣言する前に変数を使用していることであり、特にグローバルスコープ変数では混乱を招く可能性があります。例:

var result = 6;

function AddTwoAndTwo() {
    alert(result);  // should this be 6 or undefined?
    var two = 2;
    var result = two + two;
    return result;
}

混乱を避けるために、関数の先頭で変数を宣言してください。


4
+1:これが私が答える方法です。これは使用する機能でも使用しない機能でもありません。考慮すべき環境のプロパティにすぎません。
scrwtp 14年

1

どうして?

JavaScriptにはブロックスコープがありません。ブロックスコープは、物事が上に上がる理由を説明するものです。

役に立ちましたか?

これを好む場合:

var someVariable = someVariable || {};

これの代わりに:

if ( "undefined" !== typeof someVariable ) {
    someVariable = someVariable;
} else {
    someVariable = {};
}

次に、それは便利です。気づかなくても!

清算

最初の例は次のようなものに変換されます:

var someVariable = someVariableValue;

if ( "undefined" !== typeof someVariable ) {
    var someVariableValue = someVariable;
} else {
    var someVariableValue = {};
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.