2012-03-10 26 views
0

にはJavaScriptのグローバル変数二度目の結果にアクセスします。私が正しい場合、関数のコンテキスト( "this"の値)は、グローバルウィンドウオブジェクトを参照します。は、私は、次のJavaScriptコードを持っている未定義

+1

* "undefined"を出力* - 実際はそうではありません。 http://jsfiddle.net/Tomalak/dt4dg/ここに表示されているものとは異なる何かをしています。 – Tomalak

+0

私はちょうどinnerHTMLを使用してDOM要素に出力するか、コンソールにログオンします – thescientist

+0

@Tomalak:私は絶対的な肯定的です、私が書いたことは私がやっていることです:)。このコードを書く意図は、「これ」を理解することでした。私が間違っている場合に備えて、私に正しい方向を向ける。ありがとう。 –

答えて

2

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の値は、いくつかの方法のいずれかを設定します

  1. あなたは、このようなpleasures.makeIceCream()などのオブジェクトのメソッドを呼び出すと、thisの値がmakeIceCream()方法でpleasuresオブジェクトに設定されます。
  2. あなたはmakeIceCream.call(pleasures)のような関数オブジェクトにcallメソッドを使用すると、その後、thisの値はmakeIceCream()メソッドのこの呼び出しでpleasuresオブジェクトに設定されます。
  3. あなたは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オブジェクトです)。しかし、グローバル変数にアクセスするために使用するのはベストプラクティスとはみなされません。

+0

私はコンセプトについてあなたに同意します、そして私は私のプロジェクトでベストプラクティスを使用しました。しかし、あなたが言いましたように、「これはグローバルオブジェクトを指します」ということを理解したいのですが、もう2回目にdocument.write(this.x)にアクセスするのが問題です。このサンプルでは、​​ベストプラクティスではなく概念に焦点を当てています。私の懸念を理解していただければ幸いです。 "document.write"の代わりに "alert"を書くとうまくいきます。 –

+0

このコードをご覧になれますか? http://jsfiddle.net/AnupVasudeva/SJn5m/7/ –

+0

@AnupVasudeva - おそらく最初の 'document.write()'は、(いくつかのブラウザでは)既存のドキュメントとすべてのグローバル変数を新しく作成されたドキュメントとして拭き取ります。したがって、以前はグローバルオブジェクトとして存在していたものは存在しなくなりました。私が4回言ったように、ドキュメントがロードされた後に 'document.write()'を使用しないでください。効果的にコミュニケーションしていない部分は何ですか? – jfriend00

0

私はこの使用します。それはそれは関数内で呼び出すことができる関数の外で定義されているので

document.write(x); 

を。

+0

"this"の接頭辞に問題はありませんか? –

1

グローバル変数なので、objectを使う必要はありません。この

var x = 10; 
window.onload = function() { 
    document.write(x); 
    document.write(x); 
    document.write(x); 
} 

バイオリンを試してみてください:ページがロードされた後、あなたがdocument.writeをを呼び出しているので、それが動作していないhttp://jsfiddle.net/dt4dg/1/

+0

ありがとうrajkumar。私はこれがうまくいくことを知っているしかし、私はdocument.write(this.x)が動作しない理由を理解しようとしています。 window.onload関数が呼び出されると、関数コンテキスト(this)は常にウィンドウオブジェクトになります。 –

0

。書き込みを呼び出すと、暗黙のうちに新しいページをすぐに作成していることになります。新しいページはxの値を理解しません。

+0

しかし、Javascriptは "document.write(this.x)"ではなく "document.write(x)"を理解しているようです。両者に違いはありますか? –

関連する問題