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(不一定是全局的,它可能是局部xx局部于某个外部函数)的值分配给全局xwindow.x)。当'local' x 超出范围时,它在赋值时的值仍将存储在window.x变量中。

window.x = window.x || {}

window.x仅适用于;即使我们现在忘记了虚假值,它仍然与第一个值不同(它甚至不检查“本地”x存在)。

x = this.x || {}

this当它是 volatile 时(事件处理程序、超时函数等等),这可能会完全失控,并且在“使用严格”模式下不允许在外部函数体内出现。

于 2012-09-13T23:56:46.047 回答
0

如果您使用此构造:

window.x=window.x||{}

Andx 定义但具有虚假值(零、空字符串、null、NaN、未定义,当然还有 false),那么该值将被新的空对象覆盖。如果这对您来说是可以接受的,因为您确信x它将完全未定义或已经定义为对象,那么可以确定,继续...

于 2012-09-13T23:55:52.700 回答
0

以下是如何避免console.log具体破坏:

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

通常,如果您想避免使用默认 (||) 或三元 (?:) 运算符,请使用调度表:

/* 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 回答