CoffeeScript/JavaScript中的变量作用域

CoffeeScript/JavaScript中的变量作用域,javascript,variables,coffeescript,Javascript,Variables,Coffeescript,在下面的代码中,我想使用markers变量,我希望它是一个对象数组(例如,[{…},{…},{…},{…}])。但是,根据缩进级别,变量显示empy数组(即,[]) 我的期望-在第二级填充数组。 结果-第二级中的空数组 当我处于第二级时,如何检索第三级中显示的数组。您正在回调函数中填充数组。因此,在打印结果后将填充它。问题不在于范围,而在于执行顺序 如果您发出同步请求,您应该看到您所期望的: jQuery -> markers = [] $.ajax url: '/user

在下面的代码中,我想使用
markers
变量,我希望它是一个对象数组(例如,
[{…},{…},{…},{…}]
)。但是,根据缩进级别,变量显示empy数组(即,
[]

我的期望-在第二级填充数组。 结果-第二级中的空数组


当我处于第二级时,如何检索第三级中显示的数组。

您正在回调函数中填充数组。因此,在打印结果后将填充它。问题不在于范围,而在于执行顺序

如果您发出同步请求,您应该看到您所期望的:

jQuery ->
  markers = []
  $.ajax
    url: '/users.json'
    dataType: 'json'
    async: false
    success: (data) ->
      for obj in data
        marker = {}
        marker =
          lastname: namify(obj.name)
          address: obj.address
        markers.push(marker)
    console.log("3rd level", markers)
  console.log("2nd level", markers)

您正在回调函数中填充数组。因此,在打印结果后将填充它。问题不在于范围,而在于执行顺序

如果您发出同步请求,您应该看到您所期望的:

jQuery ->
  markers = []
  $.ajax
    url: '/users.json'
    dataType: 'json'
    async: false
    success: (data) ->
      for obj in data
        marker = {}
        marker =
          lastname: namify(obj.name)
          address: obj.address
        markers.push(marker)
    console.log("3rd level", markers)
  console.log("2nd level", markers)

在ECMAScript中只有两个作用域:全局和函数。有些嵌套函数的作用域链上有外部函数的激活对象,如果外部函数退出后内部函数仍然存在,则闭包可以保持这些作用域链的活动。不知道这在上面的coffeescript+jQuery+AJAX+JSON中是如何应用的。JSON看起来像什么?问题与作用域无关。请注意,
console.log(“第二级”)
行在
console.log(“第三级”)
行之前运行,请参见下面的cenanozen的回答。在ECMAScript中,只有两个作用域:全局和函数。有些嵌套函数的作用域链上有外部函数的激活对象,如果外部函数退出后内部函数仍然存在,则闭包可以保持这些作用域链的活动。不知道这在上面的coffeescript+jQuery+AJAX+JSON中是如何应用的。JSON看起来像什么?问题与作用域无关。请注意,
console.log(“第二级”)
行在
console.log(“第三级”)
行之前运行,请参见下面的cenanozen的答案。当然,实际上,您确实不想使用
async:false
(这会在服务器响应之前锁定浏览器)。只需构建你的应用程序,以便从
成功
回调继续执行。是的,这是一种糟糕的做法。我这样写只是为了演示。当然,实际上,你真的,真的不想使用
async:false
(这会在服务器响应之前锁定浏览器)。只需构建你的应用程序,以便从
成功
回调继续执行。是的,这是一种糟糕的做法。我这样写只是为了演示。