問題タブ [hoisting]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
9 に答える
4780 参照

javascript - JavaScriptの巻き上げ動作を利用するデザインパターンはどれですか?

Ben Cherryの優れた記事では、JavaScriptでの巻き上げについて適切に説明しています。しかし、私の問題は、この悪名高い混乱の加害者のユースケースを想像できないことです。この言語機能を実際に利用するデザインパターンがあるかどうかを説明してください。

第二に、スコープホイストはJavaScriptに固有のものですか?

更新---好奇心を満たす答えに賞金を追加しています:JavaScriptの巻き上げ動作を実際に利用しているデザインパターンはどれですか?JavaScriptが巻き上げをサポートしている理由は理解していますが、この機能をどのように活用できるか知りたいです。

0 投票する
3 に答える
235 参照

javascript - Javascript: z = z || [] VAR を使用していない場合にエラーがスローされる - なぜですか?

単なる知的好奇心から、なぜjavascriptは受け入れますか

z を初期化する (z が最初に定義されているように)

ただし、var がないと、エラーがスローされます (グローバル空間で)

(z が以前に定義されていない場合)

グローバル空間では、VAR を使用する必要はありませんが、悪い習慣かもしれません。

あなたが言う前に、これは次のような質問の複製です

var キーワードの目的は何ですか? また、いつ使用 (または省略) する必要がありますか?

「グローバルスコープにいる場合、違いはありません」という宣言に注意してください。

私の実際の例を考えると、明らかにそれは 100% 真実ではありません。

これは癖ですか、それとも正当なロジックはありますか?


私が学んだように答えの要約を追加します:

ティムのおかげで(以下を参照)、私の誤解の鍵はこれを認識していなかったことです(javascriptの基礎)

var z; z が既に存在する場合は何もしません

「var z」が常に初期化されると誤って仮定すると、この式は両方の方法でそれを持っているように見えます。

左から順に、「var z」は単に z が定義されていることを確認しますが、既存の値が既に存在する場合、実際には影響しません。右側では、z が既に存在する場合はそれが使用されます。そうでない場合は、変数が宣言されただけで (ただし空)、使用されませんが、エラーはスローされません。

これは、Javascript でのこの種のスコーピングと巻き上げの問題に関する優れた記事です: http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

minitech および貢献してくれた他のすべての人に感謝します。

0 投票する
3 に答える
208 参照

javascript - JavaScriptに望ましくない効果をもたらす関数を書くさまざまな方法はありますか?


アップデート:

質問が解決しました!その理由は「巻き上げ」によるものだと気づきました。基本的に、JavaScriptインタープリターはコードを解析し、関数の先頭ですべての変数を宣言します(ただし、それらは初期化しません)。そのため、2番目の例は機能しません。JavaScriptインタープリターvar changed;は関数の先頭で宣言しますが、コードの本体に到達するまで初期化しないためです。

最初の例のような関数宣言の場合、JavaScriptが2番目の例のように変数名だけを上に移動する代わりに、親関数の先頭で関数全体を上に移動(または「ホイスト」)します。これが機能する理由です。

とにかく、私は個人的な参照のためにこれを書きました、そして答えに感謝します...


これは機能します:http: //jsbin.com/emarat/7/edit

しかし、これはそうではありません:http: //jsbin.com/emarat/9/edit

なんで?

0 投票する
4 に答える
25257 参照

javascript - Javascript スクリプトが最初に実行されることを確認しますか?

特定のページで一部のスクリプトが他のスクリプトよりも先に呼び出されているように見えることに気付きました。スクリプトがロードされる具体的な順序は何ですか? 参照される .js スクリプトの前のページはめ込み? それらはページ内で最初に言及されたものから最後まで順番に実行さ<script>れますか、またはこれはブラウザーに依存しますか? 特定のスクリプトがページで最初に実行されるようにするにはどうすればよいでしょうか?

0 投票する
5 に答える
167 参照

javascript - 巻き上げに戸惑う

これらのわずかに異なる 2 つのバージョンの巻き上げを考えてみましょう...

これにより、「fingal」が出力され、次に「fingal」が出力されます

これにより、「undefined」と「fingal」が出力されます

なんで?

0 投票する
2 に答える
255 参照

javascript - JavaScriptミニファイアはvar宣言を自動的に組み合わせる必要がありますか?

YUICompressor(2.4.7)がvar宣言を組み合わせていないことを発見しました。例えば、

に圧縮します

次のように、ミニファイアが連続するvar宣言を組み合わせることができると期待するのは合理的だと思います

しかし、私の本当の質問は、(ミニファイアの場合)連続しないvar宣言を単一の関数に自動的かつ安全に組み合わせることが期待/可能であるかどうかです。

0 投票する
1 に答える
144 参照

javascript - Firebugコンソールが巻き上げを行っていない

上記のコードから、私は"hello"(そしていくつかundefinedの)コンソールにログオンすることを期待します。しかし、firebugは

それで、firebugは巻き上げをしませんか?

0 投票する
1 に答える
95 参照

javascript - 巻き上げによるラグの回避

「tapped」をログに記録してHUDをできるだけ早く実行したいのですが、oauth_upload_photoが原因で遅延が発生しています(明らかにホイストが原因です)。HUDを即座にスナップするにはどうすればよいですか??

0 投票する
3 に答える
1226 参照

javascript - Javascriptでの名前解決?

この記事を読んでいて、いくつか質問があります。

このコードを考慮する:

これは1を警告します(私の質問はなぜですか?)

この記事には、名前解決に関連することが記載されています。

名前解決 (記事によると) は、次の順序で決定されています。

3 行目では、グローバル a の値を変更するとします。しかし、関数 a(){...} は宣言内よりも優先されます (私が正しく理解した場合)、それがアラート 1 の理由です

ps 行番号 5 を削除すると、アラート 10 が表示されます。

一般に、名前が既に定義されている場合、同じ名前を持つ別のエンティティによって再定義されることはありません。つまり、関数宣言は、同じ名前の変数の宣言よりも優先されます。しかし、これは、変数代入の値が関数を置き換えないという意味ではなく、その定義が無視されるだけです。

私はその部分を理解していません:

しかし、これは、変数代入の値が関数を置き換えないという意味ではありません

2つの質問をお願いします:

  • アラート1の理由を正しく理解できましたか?

  • 上記の行はどういう意味ですか? (誤解されている部分)

ありがとう。

0 投票する
2 に答える
349 参照

javascript - 関数内からグローバル変数を変更するにはどうすればよいですか?

この単純な問題を解決するために 3 日間を費やしました。私が望むのは、ウェブサイト全体がwinversionグローバル変数の値を記憶し、それを function 内から変更できるようにすることだけです。(はい、グローバル変数は darthwader よりも悪いことを知っていますが、それが私の人生で起こっている唯一の良いことです)

を含む 1 つの html ファイルがあり<iframe>、ユーザーが内部をクリックすると、(ドメインから) さまざまなページがその にロードされます<iframe>

これは私のindex.htmlです(周りにいくつかのdivがあり<iframe>ますが、他のすべてが機能し、javascriptはこれにのみ使用されるため、無関係であると確信しています<iframe>

デフォルトの iFrame ページには、この html コードがあります

私のscript.jsはこれです

しかし、後で同じ JavaScript ファイル<iframe>を読み込もうとするwinversionと、未定義と表示されます。このnavigatenow()関数は、ユーザーが 1 ページ目で Windows バージョンを選択し、次の html ページでリンクをクリックして msconfig 説明ページ ( にロードされる<iframe>) を起動するとトリガーされます。

私が試してみました:

  • 使う/使わないvar

  • /notusing 一重引用符、二重引用符を使用します (ただし、私が知っている違いはありません)。

  • 巻き上げに関するダースの記事を読んでいます。

  • persistjs を数時間使用します。

  • 瞑想と祈り!

何も機能しません。のろわwinversionれた変数は、私の存在の目的と同じくらいまだ定義されていません。

私が望むのは、ユーザーが選択したWindowsバージョンをhtmlファイルに記憶させることだけです(プログラムでWindowsバージョンを検出することはできません。ユーザーにバージョンを尋ねる目的は異なります)。

これを修正する助けがあれば大歓迎です。そうでない場合は、飛び降りることができる適切な崖を提案してください。