問題タブ [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 - リターン後の可変巻き上げが一部のブラウザで機能するのに、機能しないのはなぜですか?
上記のコードは、IE、FF、およびOperaでエラーをスローし、returnステートメントを関数に含める必要があることを示しています。ただしundefined
、SafariとChromeでは機能します(表示されます)。
上記のコードはグローバルスコープで記述されています。すべての機能の外。
何らかの理由?
javascript - ブラウザの1つのWebページに対して実行されるJavaScriptプログラムの数はいくつですか?
JavaScriptプログラムは、ステートメントと関数宣言で構成されています。JavaScriptプログラムを実行すると、次の2つの手順が実行されます。
コードは、関数宣言とすべての関数についてスキャンされます。宣言は(関数オブジェクトを作成することによって)「実行」され、その関数への名前付き参照が作成されます(この関数をステートメント内から呼び出すことができるように)
ステートメントは順番に実行(評価)されます(コードに表示されるとおり)
そのため、これは問題なく機能します:
「foo」関数は宣言される前に呼び出されますが、関数宣言はステートメントの前に評価されるため、機能します。
ただし、これは機能しません:
ReferenceErrorがスローされます(「fooが定義されていません」)。これにより、WebページのHTMLコード内のすべてのSCRIPT要素が個別のJavaScriptプログラムを表し、HTMLパーサーがSCRIPT要素に遭遇するたびに、その要素内のプログラムを実行する(そして、プログラムが実行されると、パーサーは、SCRIPT要素に続くHTMLコードに移動します)。
次に、これは機能します:
ここでの私の理解は、グローバルオブジェクト(グローバル実行コンテキストで変数オブジェクトとして機能する)は常に存在する(そして残る)ので、最初のJavaScriptプログラムが関数オブジェクトを作成し、それを参照し、次に2番目のJavaScriptプログラムは、その参照を使用して関数を呼び出します。したがって、すべてのJavaScriptプログラム(単一のWebページ内)は同じグローバルオブジェクトを「使用」し、1つのJavaScriptプログラムによってグローバルオブジェクトに加えられたすべての変更は、その後に実行されるすべてのJavaScriptプログラムで監視できます。
さて、これに注意してください...
上記の場合、 「foo()」ステートメントがReferenceError(JavaScriptプログラム全体を破壊する)をスローするため、アラート呼び出しは実行されません。したがって、後続のすべてのステートメントは実行されません。
ただし、この場合は...
これで、アラート呼び出しが実行されます。最初のJavaScriptプログラムはReferenceErrorをスローします(そして結果として壊れます)が、2番目のJavaScriptプログラムは正常に実行されます。もちろん、ブラウザはエラーを報告します(ただし、エラーが発生した後、後続のJavaScriptプログラムを実行しました)。
さて、私の結論は次のとおりです。
- WebページのHTMLコード内のすべてのSCRIPT要素は、個別のJavaScriptプログラムを表します。これらのプログラムは、HTMLパーサーがそれらに遭遇するとすぐに実行されます。
- 同じWebページ内のすべてのJavaScriptプログラムは、同じグローバルオブジェクトを「使用」します。そのグローバルオブジェクトは常に存在します(Webページがフェッチされた瞬間からWebページが破棄されるまで)。JavaScriptプログラムはGlobalオブジェクトを操作する場合があり、1つのJavaScriptプログラムによってGlobalオブジェクトに加えられたすべての変更は、後続のすべてのJavaScriptプログラムで監視できます。
- 1つのJavaScriptプログラムが(エラーがスローされることによって)壊れた場合でも、後続のJavaScriptプログラムの実行が妨げられることはありません。
この投稿を事実確認して、何か問題があったかどうか教えてください。
また、この投稿で言及されている動作を説明するリソースは見つかりませんでした。ブラウザメーカーはそのようなリソースをどこかに公開しているはずなので、それらについて知っている場合は、それらへのリンクを提供してください。
javascript - 異なるファイル間の巻き上げ
異なるファイルに存在するソースコード間で関数と変数の巻き上げを行う方法はありますか?つまり、
と
ほとんどのjavascriptエンジンで別々に、順番に解析および実行されるさまざまなファイルがあるため、これは不可能だと思いますが、確かなことはわかりません。
異なるファイルの解析は実際には言語の一部ではないため、これがECMAの仕様に含まれているかどうかはわかりません。
javascript - このコードの alert() 行をコメントアウトすると失敗するのはなぜですか?
私はjavascriptで非常に奇妙な問題を抱えています。次のコードを取得して実行すると、エラーなしで正常に実行されますが、最初の をコメントすると、5 行目 ( ) で BoardFactory が存在しないというalert
エラーがスローされます(最初のアラートではすべてがvar _board = Bomber.BoardFactory.getBoard();
エラーなしで実行されます)。この正確な動作を Firefox と Chrome で再現できました。
私の質問は、何がこの奇妙な動作を引き起こす可能性があるのですか? 一体どのようにして、アラート呼び出しで を認識させることができるのBomber.BoardFactory
でしょうか?
clojure - clojureの「巻き上げ」の欠如を回避する
相互に関連する関数のグループがあり、それらをファイルに自然に配置する方法が依存関係と競合することを何度か発見しました (つまり、関数 1 は関数 2 に依存しますが、関数 1 の上にあります)。私がコードを書いているとき、私は通常トップレベルの式を評価し続け、ファイル全体を評価して参照などへの依存関係を更新するだけです。非常に頻繁に、依存関係の競合が発生し、多くの関数を調整する必要があることがわかりました。
私が知っている他の言語では、関数を宣言するとすぐに、それが他の何よりも前に現れたかのように、舞台裏で「巻き上げ」られます。そうすれば、コード内の順序を気にする必要がなくなり、関数をコードのモジュラー ビットとして扱うことができます。clojure で私を悩ませ続けているのは、この機能の欠如です。私は何か間違ったことをしていますか?それは大したことではなく、小さな煩わしさですが、これはあなたが注意を払うことに慣れているものですか?
javascript - 関数式自体は、名前を別の値に割り当てることはできません
以下のコードでは:
printTestは、「undefined」ではなく「function」を表示します。これは、私の理解では、変数宣言は常に実行コンテキスト(この場合は関数実行コンテキスト)の先頭に「持ち上げられる」ためです。これにより、関数宣言が作成されます。 「test()」は、現在の実行コンテキストの後半に表示されるものです。ここで、実際にvar宣言 "var test=1"に値を割り当てるこのコードについて考えてみます。
次に、printTestは「番号」を表示します。これは、実行コンテキストが異なる順序を維持することを意味します。誰かがここで実際に何が起こったのか説明できますか?
javascript - JavaScript 巻き上げと Truthy & Falsy を理解する
JavaScript ホイストについて読んだことがあります。
JavaScript スコーピングと巻き上げ by Ben Cherry
Dmitry Soshnikov による「巻き上げ」についての 2 つの言葉
そして、JavaScript の型強制、true と false のテストについての詳細: Truth, Equality and JavaScriptおよびその他のリソース
そして、いくつか練習していると、巻き上げと変数「真偽」に関する重要な概念が欠けていることがわかりました。
1: 変数宣言が重複している 'if' 真偽テスト
o/p:inside if
疑問: 'foo' の値は '1' でif(!foo)
あると評価されfalse
、そのブロックは実行されるべきではありません (上記のリソースからの引用: 巻き上げはvar
&function
宣言のみに影響し、実行には影響しません)。しかし、なぜそのアラートが表示されるのですか。これは、私が直接使用する場合にはfalse
当てはまりません (以下の非トリック コード: スニペット #3 に示されています)。
2: 変数宣言が重複しない 'if' 真偽判定
o/p:出力なし。コントロールが入っていないことを意味します 'if' ブロック
これは期待できることです
3: 重複した変数宣言で「false」を使用する「if」
o/p:出力なし。コントロールが入っていないことを意味します 'if' ブロック
これは期待できることです
誰か明確にしてください。ありがとう
javascript - 名前空間内で標準の JavaScript プロトタイプ継承を設定しますか?
JavaScript の標準的なプロトタイプの継承は次のとおりです。
Bird の関数定義は、Bird のプロトタイプとコンストラクターの割り当ての後に来る必要がありますか。名前空間内からこれを実行しようとしており、変数の巻き上げがコードの失敗を引き起こしているため、これを尋ねます。例として:
namespace.Bird.prototype 代入文を巻き上げたおかげで、namespace.Bird.prototype.constructor 代入文は失敗しました。ただし、次のコード ブロックに示すように、namespace.Bird 関数の割り当てをこれら 2 行の上に移動すると、コードは機能するように見えます。
ただし、ほとんどのリソースが関数の割り当てを最初にするのではなく、元の順序で表示する特定の理由があるかどうかはわかりません。
誰かが明確にしてもらえますか?
ありがとう!
javascript - Javascript 関数のスコープと巻き上げ
Ben Cherry による JavaScript のスコーピングとホイストに関する素晴らしい記事を読みました。
上記のコードを使用すると、ブラウザは「1」を警告します。
「1」を返す理由はまだわかりません。彼の言うことのいくつかが頭に浮かびます: すべての関数宣言は一番上に持ち上げられます。関数を使用して変数のスコープを設定できます。まだクリックしません。
javascript - JavaScript 巻き上げを完全に理解しようとする
編集 それは私の側の問題であり、私のjsfiddleの使用法だったようです:?
最近ホイストに関する記事をいくつか読んでいます。1 つはNicholas Zakas によるもので、もう 1 つはBen Cherry によるものです。
私は例に従って、自分でテストして完全に理解していることを確認しようとしていますが、主にこの例に問題があります。
undefined
そのログを記録する代わりに1
。私がすべてを正しく理解している場合は、 var ステートメントが一番上に持ち上げられているため、ウィンドウスコープに存在する必要a
がundefined
あるため、値を割り当てる必要はありません。
しかし、以下は期待どおりに動作しています。
foo
でありundefined
、baz
定義されていません。両方の例でここにフィドルがあります。本当にこれについて頭を包み込もうとしているだけです。これらの記事を書いてから、何か変わったことはありますか? 誰かがこれに光を当てることができれば、それはありがたいです. テスト時にChrome 14を使用しています。