Web開発者の常識では、ブラウザのJavaScriptでは、グローバル変数は
ウィンドウオブジェクトのプロパティであるため、
ウィンドウがそうであると示唆されてい
ます 。
何かと同義であり、同じように動作する必要があります(もちろん、変数
を再定義する
何らかの機能
を使用している場合を除きます)ローカル)。
Web開発者の常識は、未定義の変数は未定義でなければならないことを示唆しています-そのため、
何かの変数がjavascriptで定義されていない場合(そして、もちろん、定義されていない奇妙な定義
がない場合)、
Something と undefinedは同義であり、同じように動作する必要があります。
ただし、Opera 11(
Opera 11.01の初期バージョンでも、新しい
Opera 11.61でも)のプログラムを作成する場合
は、これらの
両方のケース
で常識を放棄する準備をしてください!
(Operaだけでなく、他のブラウザーや環境でも-それについては後で詳しく説明します。)これをより明確にするために、
Underscore.jsライブラリを使用します。このライブラリには、不定変数をテストするための便利な関数があります。これは
、 ソースコードで自明な方法
で 定義さ れている
_.isUndefined()関数です。
また、
Underscore.jsライブラリは独自のページ
http://documentcloud.github.com/underscore/に接続されているため、このページに移動し
て、よく知られているキーボードショートカット
Ctrl + Shift + Iで Opera Dragonflyを起動することをお勧めします
。Dragonflyコンソールで3つのテストを行うだけで、生きた恐怖の深みに触れることができます。
![[テスト結果]](https://habrastorage.org/getpro/habr/post_images/ccb/630/420/ccb6304201c99c2acf0b02e8e5f2d3a8.png)
このスクリーンショットには何が表示されていますか?
最初に、
_。isUndefined(undefined)をチェックし、
trueになりました -もちろん、これはそうあるべきです。
次に、
_。isUndefined(Anything)をチェックし
ました。これにより、Operaでエラー状態が発生しました。 したがって
、 未定義は通常の未定義変数のようにはまったく動作しない
ことがわかります。 さらに暗いものもあります:関数内で未定義のグローバル変数(特別な未定義変数
undefinedを除く)を正しく送信することはできません!
そして最後に
_.isUndefined(window.whatever)をチェックし
ました -そして突然行
がtrueになりました ! 一方で、これはそうでなければなりません。 一方、前のチェックと比較すると、同じ名前のグローバル変数と
ウィンドウオブジェクトプロパティが定義されていない場合、それらの動作が非常に
異なることがすぐにわかります。プロパティに関数を正しく渡すことができることがわかりますが、これはグローバル変数では機能しません選択しないでください。
Dragonflyコンソールの場合、そのような厳密さとバグを探す意欲は依然として正常です。 全体的な問題は、OperaがWebページ上のJavaScriptにまったく同じ標準でアプローチするため、
Underscore.jsライブラリの
_.isUndefined()関数
が一般に役に立たなくなることです。エラーなしで単純なグローバル変数に適用することはできません、毎回接頭辞
" windowを使用する場合
。 「それでは
、庭を囲うために何が
あっ たのですか? -従来の方法で不確実性を確認する方
が簡単です:
typeof == 'undefined'
この問題を回避するには、このエレガントでミニチュアの松葉杖のようなものを作成する必要があります。
_.isUndef = function(name){ return _.isUndefined(window[name]); };
この後、グローバル変数の不確実性のチェックがエラーのない短い形式になることを比較して確認できます。
_.isUndefined()
これまでOperaについて説明してきましたが、問題はOperaブラウザーよりもはるかに広いことを理解しています。 たとえば、同じことがNode.JSエンジンの特徴であることを示すのは簡単です。
![[NodeJSスクリーンショット]](https://habrastorage.org/getpro/habr/post_images/739/fac/2a5/739fac2a58071960c08f9119a2ba5024.png)
上記の松葉杖の類似物は未定義のグローバル変数の検証をサポートできることは明らかであり、この場合、ノードでは通常のように、その中のグローバルオブジェクトのみが
windowでは なくglobalを記録する必要があり
ます 。
V8エンジンを使用してJavaScriptを解釈する他のアプリケーションで未定義のグローバル変数を操作する場合、同様の効果が期待できると強く思います。 コメントでは、
TheShockはGoogle Chromeがそれらのアプリケーションの1つであると言っています。
また、Firefox
のWebコンソールで
は、エラー
なしでコード
「 _.isUndefined(Anything) 」を呼び出すことができないことも簡単に確認できます。 javascriptエラー(「
定義されていないものは何でも 」)は、次の
HTMLコードをFirefox 11にロードしようとします
。 <!doctype html> <script> isUndefined = function(i){ return i === void 0; } main = function(){ document.getElementById('b').innerHTML = isUndefined(whatever); } </script> <body id="b" onload="main();"> </body> </html>
どこでも、どこでも不明確なグローバル変数は、関数のパラメーターとして使用する前にチェックする必要があります。