在javascript中存在地定义变量的快捷方式

时间:2012-09-13 23:50:35

标签: javascript global-variables variable-assignment local-variables not-exists

为了避免破坏现有变量,我有这样的代码

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

这似乎是一种很长时间的定义方式,但是必须避免控制台错误。

我试了一下,似乎工作正常。可以定义这样的变量吗?

window.x=window.x||{}

甚至在全球范围内......

x=this.x||{}

3 个答案:

答案 0 :(得分:1)

这些非常不同。

首先,在不检查typeof ... === 'undefined'的情况下,您将基本上重写任何'falsy'值。但这是微不足道的,还有更微妙的细微差别。

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

这会将某些x(不一定是全局的,可能是某个外部函数的本地xx}的值分配给全局x({ {1}})。当'local'x超出范围时,其值在分配时仍将存储在window.x变量中。

window.x

仅适用于window.x = window.x || {} ;即使我们现在忘记了关于虚假价值的事情,它仍然不能与第一个一样(它甚至不检查'本地'window.x存在)。

x

x = this.x || {} 易变(事件处理程序,超时函数,仅举几例)时,这个可能完全失控,并且在'use strict'模式下不允许在外部函数体内。

答案 1 :(得分:0)

如果您使用此构造:

window.x=window.x||{}

并且x 定义但有一个假值(零,空字符串,null,NaN,未定义,当然是假)然后该值将被新的覆盖空对象。如果您认为这是可以接受的,因为您确信x将完全未定义或已定义为对象,那么请确定,继续......

答案 2 :(得分:0)

以下是如何避免特别抨击console.log

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

一般情况下,如果要避免使用默认(||)或三元(?:)运算符,请使用dispatch table

/* 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);
  

一个可选地指向元素数组的对象。对象始终具有相同数量的键/值对,并且每个数组元素始终具有相同的大小。因此,可以按名称或值访问数组索引。

<强>参考