Chrome与Firefox中的动态窗口变量(window [])

时间:2014-01-17 18:22:55

标签: javascript jquery google-chrome firefox

我正在以一种在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 undefinedconsole.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

1 个答案:

答案 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