2017-03-17 5 views
-4

私が学んでいることを理解するのに助けが必要です。私のコードのいくつかの行は、変数を設定します。の名前はです。これはユーザーの名前を保持し、要素がクリックされると設定されます。ブラウザで変数名がデフォルトで設定されているのはなぜですか?

私が発見した問題は、要素をクリックしなくても、ユーザーがコンソールで引き続きアクセスできることです。

私のコードで何かが間違っていると思っていましたが、同じサイトが別のサイトにアクセスしていました。例えば、facebookの変数にアクセスすると、"_e_0MDe"が得られます。他のサイトでは、空の文字列が得られます(""など)。

どうしてですか? ありがとうございます。

+0

"_私はfacebookの下で変数名にアクセスしようとしました。" "あなたは何をしましたか? – csmckelvey

+3

あなたの質問は少し不明です。コード例を提供できますか? – christopher

+0

javascriptでは、変数を 'var'で定義する必要はありません。値を割り当てるとすぐに定義されます。 –

答えて

4

window.nameはDOM APIの一部です。 Facebookはそれを設定する必要があります。あなたは裸のスクリプトタグ内の変数を宣言する場合

は、そのはそれが新しいスコープを作成する機能を使用しないようにするためにはwindow

<script> 
    var name = 'foo'; 
    console.log(window.name); // "foo" 
</script> 

の一部として扱わ(または使用let

<script> 
    (function() { 
    var name = 'foo'; 
    })(); 
    console.log(window.name); // what ever it was before this function call 
</script> 
+0

ああ...そういうリストがありますか? –

+0

OPはおそらくグローバル変数を使用すると考えられるので、もっともらしい説明のようです。 –

+0

@ jamesOduro何のリスト? –

0

多くのスクリプト言語と同様に、JavaScriptは変数の宣言と初期化で非常に緩やかなものになります。これにより、迅速な開発が可能になりますが、scopingに気づく必要があります。

あなたが見ている可能性があるのは、グローバルスコープの衝突です。デフォルトでは、ブラウザにはwindowというグローバルオブジェクトがあります。このオブジェクトは宣言した関数のどこでも使用できます。

あなたが予約語(varletfunctionclassimportconst)のいずれかでブロック内の変数を初期化しない場合は、グローバルスコープを使用することができます。たとえば、次は同等です:

  • "use strict"; 
    

  • name = 'foo'; 
    window.name = 'foo'; 
    

構文の間違いを避けるために、開発者は多くの場合、彼らのコードの先頭にある魔法のフレーズが含まれます

詳細については、John Resigのstrict modeサイトを参照してください。

関連する問題