JavaScript 闭包和变量作用域

标签 javascript jquery closures scope

我很难理解 JS 中闭包和变量作用域的概念。具体来说,如何访问类中深度嵌套的 styleData 变量,然后访问从该类创建的对象?

我确定我这里还有其他一些错误,所以请插话并在您认为合适的地方纠正我。谢谢!

var BuildJSON = {
    convert: function() {
        $.ajax({
            type: "GET",
            url: "style2.xml",
            dataType: "xml",
            success: function(xml) {
                var styleData = $.xml2json(xml);
                return styleData; // Do I need to return this somehow?
            }
        //How to get access to styleData??
        });                 
    },

    styleData: this.convert();
};

var myClass = function() {
    this.info = BuildJSON.styleData;
};

var myObject = new myClass;

alert(myObject.info.Style[0].name);

最佳答案

JavaScript 中的闭包是函数,因此在函数范围内声明的任何内容都只会在该函数内可见。

在您的示例中,styleData 是本地的,它属于 success 函数,无法在其他任何地方访问。最简单的解决方案是在 BuildJSON 范围的顶部声明该变量,在这种情况下,因为您将该对象声明为对象文字,您可以将其初始化为该对象的属性:

this.styleData = '',

...

success: function(xml) {
  BuildJSON.styleData = $.xml2json(xml);
}

这种方法的“问题”是 styleData 是公开的,也许这不是您想要的。如果您想在 BuildJSON 中使用该变量但又不想公开访问该变量,则模块模式可以派上用场。

var BuildJSON = (function(){
  var styleData = '', // local
      convert = function(){ ... } // You can use style data here

  return {
    convert: convert // Return only stuff you want to be public
  }
}())

关于JavaScript 闭包和变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11604780/

相关文章:

javascript - foreach里面的返回值

javascript - Fabric.js 的文本框不换长字

php - 上传图像后blueimp jQuery-File-Upload不显示缩略图

jquery - Ajax json 到 MVC5 Controller : Passing object containing a collection

swift - 函数不返回字符串

emacs - `apply-partially` 的定义如何在 Emacs 24 中工作?

javascript - 如何修复 ChangeDetectorRef 导入错误 : No provider for ChangeDetectorRef

javascript - 当使用 jQuery 完成表单提交时,如何发送非空输入?

javascript - 闭包地理编码循环多个标记变量

JavaScript "ch.match is not a function"