未定義のグローバル変数の処理は、常識からはほど遠いです! しかし、それは克服することができます...

Web開発者の常識では、ブラウザのJavaScriptでは、グローバル変数はウィンドウオブジェクトのプロパティであるため、 ウィンドウがそうであると示唆されています何かと同義であり、同じように動作する必要があります(もちろん、変数再定義する何らかの機能を使用している場合を除きます)ローカル)。

Web開発者の常識は、未定義の変数は未定義でなければならないことを示唆しています-そのため、 何かの変数がjavascriptで定義されていない場合(そして、もちろん、定義されていない奇妙な定義ない場合)、 Something undefinedは同義であり、同じように動作する必要があります。

ただし、Opera 11( Opera 11.01の初期バージョンでも、新しいOpera 11.61でも)のプログラムを作成する場合は、これらの両方のケース常識を放棄する準備をしてください! (Operaだけでなく、他のブラウザーや環境でも-それについては後で詳しく説明します。)

これをより明確にするために、 Underscore.jsライブラリを使用します。このライブラリには、不定変数をテストするための便利な関数があります。これは ソースコードで自明な方法 定義さ れている_.isUndefined()関数です。

// Is a given variable undefined? _.isUndefined = function(obj) { return obj === void 0; }; 

また、 Underscore.jsライブラリは独自のページhttp://documentcloud.github.com/underscore/に接続されているため、このページに移動して、よく知られているキーボードショートカットCtrl + Shift + Iで Opera Dragonflyを起動することをお勧めします

Dragonflyコンソールで3つのテストを行うだけで、生きた恐怖の深みに触れることができます。

[テスト結果]

このスクリーンショットには何が表示されていますか?

最初に、 _。isUndefined(undefined)をチェックし、 trueになりました -もちろん、これはそうあるべきです。

次に、 _。isUndefined(Anything)をチェックしました。これにより、Operaでエラー状態が発生しました。 したがって未定義は通常の未定義変数のようにはまったく動作しないことがわかります。 さらに暗いものもあります:関数内で未定義のグローバル変数(特別な未定義変数undefinedを除く)を正しく送信することはできません!

そして最後に_.isUndefined(window.whatever)をチェックしました -そして突然行trueになりました 一方で、これはそうでなければなりません。 一方、前のチェックと比較すると、同じ名前のグローバル変数とウィンドウオブジェクトプロパティが定義されていない場合、それらの動作が非常に異なることがすぐにわかります。プロパティに関数を正しく渡すことができることがわかりますが、これはグローバル変数では機能しません選択しないでください。

Dragonflyコンソールの場合、そのような厳密さとバグを探す意欲は依然として正常です。 全体的な問題は、OperaがWebページ上のJavaScriptにまったく同じ標準でアプローチするため、 Underscore.jsライブラリの_.isUndefined()関数が一般に役に立たなくなることです。エラーなしで単純なグローバル変数に適用することはできません、毎回接頭辞" windowを使用する場合 それでは、庭を囲うために何があっ たのですか? -従来の方法で不確実性を確認する方簡単です:

 typeof  == 'undefined' //   _.isUndefined(window.) //     ! 

この問題を回避するには、このエレガントでミニチュアの松葉杖のようなものを作成する必要があります。

 _.isUndef = function(name){ return _.isUndefined(window[name]); }; 

この後、グローバル変数の不確実性のチェックがエラーのない短い形式になることを比較して確認できます。

 _.isUndefined() //    Opera! _.isUndef('') //       }; 

これまでOperaについて説明してきましたが、問題はOperaブラウザーよりもはるかに広いことを理解しています。 たとえば、同じことがNode.JSエンジンの特徴であることを示すのは簡単です。

[NodeJSスクリーンショット]

上記の松葉杖の類似物は未定義のグローバル変数の検証をサポートできることは明らかであり、この場合、ノードでは通常のように、その中のグローバルオブジェクトのみが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> 

どこでも、どこでも不明確なグローバル変数は、関数のパラメーターとして使用する前にチェックする必要があります。

Source: https://habr.com/ru/post/J140433/


All Articles