我正在以一种在Chrome中运行良好的方式定义动态变量:
id = parent.data('parent_id')
$.ajax
...
success: (res, status, xhr) ->
alert(res.results.slice(0,4)) # gives '[object Object],[object Object],[object Object],[object Object]' in Chrome and FF
window[id] = res.results.slice(0,4) # works fine to set in Chrome
console.log(window[id]) # gives correct object in Chrome, 'undefined' in FF
...
但是,当我尝试在Firefox中使用相同的语法时,我在FF控制台中获得TypeError: obj is undefined
,console.log(window[id])
也写入“未定义”。
在Chrome和Firefox中使用此功能的正确方法/语法是什么?
修改
在我尝试定义alert(res.results.slice(0,4))
之前, [object Object],[object Object],[object Object],[object Object]
在Chrome和Firefox中都提供了window[id]
,因此此时已定义了该对象。
编辑2
此处的示例:http://jsfiddle.net/8Wk9J/。适用于Chrome,但在Firefox中提供undefined
答案 0 :(得分:1)
技术变量不能以数字开头,对象的键可以,但window
必须是特例。如果您创建一个有效的变量名称,它将起作用。即:http://jsfiddle.net/8Wk9J/1。结论,不要使用window
,请使用您自己的对象:
id = 12345
myobj = {}
$.ajax
...
success: (res, status, xhr) ->
myobj[id] = ...
console.log myobj[id] # it should work fine
此外,在异步操作中分配类似的变量是问题的根源。你永远不知道什么时候会设置这个变量,你可能会得到undefined
。为了避免将来出现问题,我建议您使用依赖于内部回调的逻辑,或者使用Deffered Object。