問題タブ [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.
javascript - 変数が持ち上げられないのはなぜですか?
インクリメントするグローバル変数があります(ここi
のフィドルを参照):
Chromeでは、エラーが発生しますUncaught ReferenceError: i is not defined
。
i
変数をここでホストするべきではないので、関数内increment
で変数は?i
として定義されます。undefined
javascript - javascript でホイスト
前に質問したのですが、誰かが私にガイドをくれて、それを読んでこれを見ました
彼は、JavaScript 巻き上げのために temp が未定義になると言いましたが、なぜそうであってはならないのかわかりません。
では、なぜその未定義なのですか?
javascript - JS が初めてで、巻き上げを理解しようとしている
重複の可能性:
JavaScript 変数の再宣言
次のコードがあります。
2 番目alert(i)
(関数内) は を生成しundefined
ます。JSエンジンがコードを実行する方法に関係していると思います.行を通過する前に、最初に変数を保存しないのでしょうか?
とにかく巻き上げに対応しているのでこれはJSなら問題ないと思いました。私はおそらくそれを間違えました - 誰か説明してくれませんか?
ありがとう!
javascript - 関数呼び出しのパラメーターとして定義された関数名は巻き上げられません。なぜだめですか?
次のコードを検討してください。
a
が定義される前にアクセスされているように見えることに注意してください。コンソール出力は次のとおりです: ( jsfiddle )
関数名と変数名は他のコードが実行される前に定義されるため、console.log 呼び出しはここで機能します。これを巻き上げといいます。
ただし、関数が関数呼び出しでパラメーターとして定義されている場合、これは機能しません。このコードを見てください。
b
関数が への呼び出し内で定義されていることに注意してくださいa
。クロージャーの内部ではなく、呼び出しの内部。コンソール出力は次のとおりです: ( jsfiddle )
なぜこれが起こるのか疑問に思っています。これは意図した動作ですか?これは、Chrome と Firefox の両方で発生します。
更新:このjsfiddleは、関数式の名前が、それらが定義されているスコープでは使用できないことを示しています。ただし、名前は関数自体のスコープ内で定義されます。つまり、名前付き関数式は名前を参照できますが、関数内でのみ参照できます。name
名前は、関数のパラメーターにも格納されます。
javascript - ChromeとFirefoxでのJavascriptの巻き上げ
ChromeとFirefoxでこれを実行すると、異なる答えが得られます。
Chromeでは結果は「いいえ」です。Firefoxでは結果は「はい」です。
なぜ違いがあるのですか?
c++ - std::vectorのサイズをキャッシュする方が速いですか
std :: vectorをラップし、ベクトルのサイズを格納するC++クラスを見ています。このクラスは、ベクトルが変更されるたびにこのサイズを更新し、多くの冗長なコードを生成します(最新のサイズは、size()メソッドから常に利用できるため)。これは本当に高速ですか、それともコンパイラはsize()の反復使用を最適化しますか?
javascript - JavaScript では、ローカル変数が巻き上げられると、宣言される前でもスコープ内にありますか?
JavaScript忍者の秘密の本の中で、p。43 - 46、次のようなコードがあります。
そして結論は、アサーションが失敗したため、「宣言されるまで、b はまだスコープ内にない」ということです。しかし、まず第一に、b
すでにローカルスコープを持っている可能性がありますが、それはまだ「数」ではないということです。 b
実際、すでにローカル スコープb
であり、すべてのグローバル スコープをシャドーしますb
。
例えば:
が出力されるため、行が実行されると、すでにローカルスコープ123
であることがわかります。(ただし、割り当ての前はまだ初期化されていません)。b = 456;
b
b
また、に代入する代わりに印刷することもできますb
:
繰り返しになりますが、最初の出力は is not 123
but isであることがわかります。これは、 がローカル スコープであることundefined
を意味します。したがって、本の例では、実際には既にスコープ内にあります。b
b
b
上記の説明と概念は正しいですか?
javascript - JavaScriptが変数をホイストするのはなぜですか?
JavaScriptが変数をホイストするのはなぜですか?
ホイストを実装することを決定したときの設計者の論理的根拠は何でしたか?これを行う他の人気のある言語はありますか?
ドキュメントおよび/または記録への関連リンクを提供してください。
javascript - なぜ catch 句には独自の字句環境があるのですか?
ECMA-262 v5.1 からの次の抜粋を検討してください(最近この質問で見ました)。
レキシカル環境は、ECMAScript コードのレキシカル ネスト構造に基づいて、識別子と特定の変数および関数との関連付けを定義するために使用される仕様タイプです。レキシカル環境は、環境レコードと、場合によっては外部レキシカル環境への null 参照で構成されます。通常、レキシカル環境は、FunctionDeclaration、WithStatement、または TryStatement の Catch 句などの ECMAScript コードの特定の構文構造に関連付けられており、そのようなコードが評価されるたびに新しいレキシカル環境が作成されます。
catch
これは、節の本体が関数のように独自の変数を巻き上げることを意味すると思っていましたが、明らかにそうではありません。
理由を知っている人はいますか?catch
また、節が独自の語彙環境を必要とするのはなぜですか?