にはJavaScriptのグローバル変数二度目の結果にアクセスします。私が正しい場合、関数のコンテキスト( "this"の値)は、グローバルウィンドウオブジェクトを参照します。は、私は、次のJavaScriptコードを持っている未定義
答えて
document.write()
を使用すると、ドキュメントが読み込まれた後、新しいドキュメントが開きます(前のドキュメントはクリアされます)。いくつかのブラウザ(IEなど)では、グローバル変数は、document.write()
を実行していたスクリプトからでもすぐに消去されるように見えます。ここでの最良の答えは、ページがロードされた後にdocument.write()
を使用しないことです。その代わりに、DOM操作を使用して既存の文書を変更しますが、新しい文書を作成するのではなく変更してください。あなたはdocument.write()
をthis jsFiddleに使用するのではなく、DOM操作(innerHTMLの操作)を使用すると、(最近のコード例に基づいて)うまくいくことが分かります。
現在のドキュメントをクリアすることは、決してあなたがしたいことではないため、実際に何を達成しようとしているのか説明できる場合は、ソリューションを使用して改善することができます。
ロード後に既存のドキュメントをmodify
にする場合は、.innerHTML
(ノードのHTMLを変更する)やDOM操作関数などのDOM操作関数を使用して、既存のドキュメントに新しいノードを追加する必要がありますdocument.write()
。
一般に、グローバル変数を参照するのにthis
を使用しないでください。グローバル変数は、プレフィックスなし(ローカルでオーバーライドされていない場合)またはwindow
プレフィックスで利用可能です。
ので、これらのいずれかが動作します:this
の使用に関するご質問については
<script type="text/javascript">
var x = 10;
window.onload = function() {
console.log(x);
console.log(x);
console.log(x);
}
</script>
<script type="text/javascript">
var x = 10;
window.onload = function() {
console.log(window.x);
console.log(window.x);
console.log(window.x);
}
</script>
を。 this
の値は、いくつかの方法のいずれかを設定します
- あなたは、このような
pleasures.makeIceCream()
などのオブジェクトのメソッドを呼び出すと、this
の値がmakeIceCream()
方法でpleasures
オブジェクトに設定されます。 - あなたは
makeIceCream.call(pleasures)
のような関数オブジェクトにcall
メソッドを使用すると、その後、this
の値はmakeIceCream()
メソッドのこの呼び出しでpleasures
オブジェクトに設定されます。 - あなたは
makeIceCream.apply(pleasures)
のような関数オブジェクトにapply
メソッドを使用すると、その後、this
の値はmakeIceCream()
メソッドのこの呼び出しでpleasures
オブジェクトに設定されます。
あなたはこれらのMDNの参考文献に.call()
と.apply()
詳細を読むことができます:
が適用されます。https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply
コール:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call
を他のすべての時間では、this
の値は、一般的ではありません明示的に設定されていないため使用されます。これはグローバルオブジェクトに設定されている可能性があります(ブラウザでは、これはwindow
オブジェクトです)。しかし、グローバル変数にアクセスするために使用するのはベストプラクティスとはみなされません。
私はコンセプトについてあなたに同意します、そして私は私のプロジェクトでベストプラクティスを使用しました。しかし、あなたが言いましたように、「これはグローバルオブジェクトを指します」ということを理解したいのですが、もう2回目にdocument.write(this.x)にアクセスするのが問題です。このサンプルでは、ベストプラクティスではなく概念に焦点を当てています。私の懸念を理解していただければ幸いです。 "document.write"の代わりに "alert"を書くとうまくいきます。 –
このコードをご覧になれますか? http://jsfiddle.net/AnupVasudeva/SJn5m/7/ –
@AnupVasudeva - おそらく最初の 'document.write()'は、(いくつかのブラウザでは)既存のドキュメントとすべてのグローバル変数を新しく作成されたドキュメントとして拭き取ります。したがって、以前はグローバルオブジェクトとして存在していたものは存在しなくなりました。私が4回言ったように、ドキュメントがロードされた後に 'document.write()'を使用しないでください。効果的にコミュニケーションしていない部分は何ですか? – jfriend00
私はこの使用します。それはそれは関数内で呼び出すことができる関数の外で定義されているので
document.write(x);
を。
"this"の接頭辞に問題はありませんか? –
グローバル変数なので、objectを使う必要はありません。この
var x = 10;
window.onload = function() {
document.write(x);
document.write(x);
document.write(x);
}
バイオリンを試してみてください:ページがロードされた後、あなたがdocument.writeをを呼び出しているので、それが動作していないhttp://jsfiddle.net/dt4dg/1/
ありがとうrajkumar。私はこれがうまくいくことを知っているしかし、私はdocument.write(this.x)が動作しない理由を理解しようとしています。 window.onload関数が呼び出されると、関数コンテキスト(this)は常にウィンドウオブジェクトになります。 –
。書き込みを呼び出すと、暗黙のうちに新しいページをすぐに作成していることになります。新しいページはxの値を理解しません。
しかし、Javascriptは "document.write(this.x)"ではなく "document.write(x)"を理解しているようです。両者に違いはありますか? –
- 1. QueryDSL uniqueResultは()私は、次のコードを持っている未定義
- 2. Angular2「これは」私はこのようなコード持っている未定義
- 3. JavaScriptは、私は次のコードを持っている属性
- 4. GETデータは、私は次のhtml持っているJavaScriptコード
- 5. JavaScriptと私は次のコードを持っている
- 6. Javascriptが、私は次のコードを持っているQML
- 7. 私は次のコードを持っている特定の日付
- 8. Javascriptを:それは未定義だ場合、私はこのコードを持って、デフォルトの文字列
- 9. 「未定義のは」私のJavascriptのコードではサファリ
- 10. 未定義__construct()内の変数...が、私は次のコード書いて、それを
- 11. はその後、私は、次のコレクションの定義を持っている_id
- 12. jQueryのスライダー:キャッチされない例外TypeError:私は、次のjqueryのスライダーコードを持っている未定義
- 13. 私は、次のPHPコードを持っている私のデータベース
- 14. は、私は現在、次の表の定義を持っているCSSスタイル
- 15. は、私は次のコードを持っているエンティティの作成
- 16. は、私は次のコードを持っているのPython
- 17. は、私は次のコードを持っているjQueryのコールバック
- 18. は、私は、次のコードを持っているJavaの
- 19. アレイのFileInfo []は、私は次のコードを持っているファイル
- 20. のSQLite Pythonは、私は次のコードを持っているテーブル
- 21. は、私はPythonで、次のコードを持っているNode.jsの
- 22. は、プログラム私は次のコードを持っているのDataTable
- 23. は、私は次のコードを持っているwxPythonの
- 24. jQueryのは、私は次のコードを持っている
- 25. は、私は次のコードを持っているのコンストラクタ
- 26. ( ")私は次のコードを持っているはずのjQuery
- 27. のClojure(アレフ)サーバーは、私は次のコードを持っている
- 28. は、私は次のコードを持っているJavaの
- 29. Haskellは、私は次のコードを持っているのInt
- 30. 左外側には、私は次のクラス定義を持っている
* "undefined"を出力* - 実際はそうではありません。 http://jsfiddle.net/Tomalak/dt4dg/ここに表示されているものとは異なる何かをしています。 – Tomalak
私はちょうどinnerHTMLを使用してDOM要素に出力するか、コンソールにログオンします – thescientist
@Tomalak:私は絶対的な肯定的です、私が書いたことは私がやっていることです:)。このコードを書く意図は、「これ」を理解することでした。私が間違っている場合に備えて、私に正しい方向を向ける。ありがとう。 –