2

To avoid clobbering existing variables, I have code like this

window.x = typeof x != "undefined" ? x : {}

Which seems like a very long winded way to define something, but necessary to avoid console errors.

I tried this out instead, and it seems to work ok. Is it ok to define a variable like this?

window.x=window.x||{}

Or even in the global scope...

x=this.x||{}
4

3 に答える 3

1

これらは非常に異なります。

まず、チェックせずに、typeof ... === 'undefined'基本的に「偽の」値を書き換えます。しかし、それは些細なことであり、より微妙なニュアンスがあります。

window.x = typeof x != "undefined" ? x : {} 

xこれにより、一部の値(グローバルである必要はありません。ローカルxまたはx一部の外部関数のローカルである可能性があります)がグローバルx( )に割り当てられますwindow.x。その'ローカル'xがスコープ外になる場合でも、割り当て時の値は変数に格納されwindow.xます。

window.x = window.x || {}

これはでwindow.xのみ機能します。現時点で偽の値を忘れたとしても、最初の値と同じようには機能しません(「ローカル」のx存在もチェックしません)。

x = this.x || {}

そして、これthisは揮発性の場合(イベントハンドラー、タイムアウト関数など)、完全に混乱する可能性があり、「厳密な使用」モードでは外部関数の本体内で許可されません。

于 2012-09-13T23:56:46.047 に答える
0

この構成を使用する場合:

window.x=window.x||{}

そしてx 定義されていますが、偽の値(ゼロ、空の文字列、null、NaN、未定義、そしてもちろんfalse)がある場合、その値は新しい空のオブジェクトで上書きされます。x完全に未定義であるか、オブジェクトとしてすでに定義されていると確信しているため、それが許容できる場合は、先に進んでください...

于 2012-09-13T23:55:52.700 に答える
0

console.log具体的には、混乱を避ける方法は次のとおりです。

var console = window.console || {"log": function(){} };

一般に、default(||)またはternary(?:)演算子を避けたい場合は、ディスパッチテーブルを使用します。

/* Check for IE Mutation Event */
var browser = "onpropertychange" in document;

/* Map boolean values to variables */
var detect = { "true": ie_param, "false": w3_param };

/* Map string templates with escaped quotes to variables */
var w3_param = [".addEventListener","\u0022DOMAttrModified\u0022",",false"];
var ie_param = [".attachEvent","\u0022onpropertychange\u0022",""];

/* Shadow array indices with key/value pairs */
var api = {"event":0,"attribute":1,"state":2};

/* Generate DOM lookup based on boolean value and matching string template */
var result = "document.getElementsByTagName(\u0022body\u0022)[0]".concat(detect[browser][api.event], "(", detect[browser][api.attribute], ",alert", detect[browser][api.state], ")");

/* Execute generated code */ 
var lazy = Function(result);

オプションで要素の配列を指すオブジェクト。オブジェクトには常に同じ数のキーと値のペアがあり、各配列要素のサイズは常に同じです。したがって、配列インデックスには名前または値でアクセスできます。

参考文献

于 2013-06-04T19:43:05.383 に答える