2013-12-20 13 views
5
window.scope = 'global' 
Object.prototype.scope = 'object proto' 

console.log(scope); 

私はスコープをテストするために簡単なスクリプトを書いていますが、私はchrome dev toolsとjsfiddleで別の結果を得ました。なぜ同じコードがjsfiddleで別の結果を返すのですか

  • chrome: 'object proto';
  • jsfiddle: 'global';

なぜですか?

+1

興味深い。しかし、実際にあなたがしようとしていることは何ですか?私はあなたが、 'Object.prototype'を列挙可能なプロパティで拡張するよりも、思考実験のようなものであることを知っていると仮定します。 –

+0

いずれの場合でも、実際の環境で得られる結果(http:// jsbin .com/aniqurUh/1)(たとえば、開発ツールとは対照的に、あなたがリンクしていないようなフィドルのような)正しい結果です。私は、開発ツールで時折奇妙なことがあるのを発見することに全く驚いていません。 –

答えて

1

新しいHTMLドキュメントにコードを貼り、Chromeで表示すると、ページが読み込まれたときにコンソールにglobalが印刷されます。

あなたは直接デベロッパーツールのコンソールにコードを貼り付けると、あなたが得る:

object proto 
undefined 

そして、何デベロッパーツールを実際に評価することは(私の場合)次のスクリプトであるため、それは次のようになります。

with ((console && console._commandLineAPI) || {}) { 
    window.scope = 'global' 
    Object.prototype.scope = 'object proto' 

    console.log(scope); 
} 

したがって、withステートメントを使用すると、consoleが現在のスコープチェーンに追加されます。は、scope変数に変更します。 scopeにアクセスする前にオブジェクトのプロトタイプを拡張しているので、scope(実際にはを参照しています(withステートメントのおかげで)を参照したときの操作結果が表示されます。出力の2行が」なぜ

理由は明白です:最初に、console.logが実行されますので、メッセージがコンソール上に印刷され、その後、デベロッパーツールはあなたに何もではない表現console.logの結果を(与え関数は戻り値を持たない)。

これはあなたに少し物事を明確にすることを望みます。

関連する問題