【问题标题】:Javascript objects & methods: what can see what, and why?Javascript 对象和方法:什么可以看到什么,为什么?
【发布时间】:2012-06-07 07:35:52
【问题描述】:

我有一个程式化形式的设置,如下所示:

(function () {
    var db = {
        com: {                    EDIT: Changed this from [...] to {...}
            324: {
                unmod: "xyz"
            }
        }
    };

    var report = {
        mymethod: function () {
            var x = db.com[324].unmod;
        }
    };
})();

我收到的错误消息是db.com is undefined。在我看来,report.mymethod 无法“看到”db.com。对吗?

一个因素可能是db.com 是通过循环访问 AJAX 数据创建的,如下所示:

    for (i = 0; i < length1; i++) {
            cat = o.cat[i];
            length2 = cat.com.length;

            // Loop through comments
            for (j = 0; j < length2; j++) {
                com = cat.com[j];

                // Create db object
                this[com.cnum] = {
                    unmod: com.unmod
                };
            }               
    }

问题是关闭吗?

AJAX数据的相关部分是这样的

       "cat":[  
        { ...
          "com": [ {"cnum":"324", "unmod":"xyz"},...]  
        }, ...],

抱歉,AJAX 名称和属性名称相同。这对我来说更容易,但对你们来说可能不是:)

【问题讨论】:

  • 您的“风格化形式”示例是无效的 Javascript,因此无法测试。在不知道填充 db.com 的代码与产生错误的代码之间的关系的情况下,没有人能猜到哪里出了问题。
  • @lanzz 谢谢。哪个位无效(以及如何)?填充db.com 的位还是尝试访问其内容的位?
  • 填充代码。您不能使用与 object-literal 相同的语法来初始化数组元素(即,[ 324: { ... 是语法错误)。修复人口中的错误后,您的访问代码将按预期工作:jsfiddle.net/4bL8T
  • @lanzz 感谢 jsfiddle。如果我 (1) 添加一个属性到 db com: {} 然后 (2) 将我的填充循环更改为:this.com[com.cnum] = {unmod: com.unmod}; 我改变了我的想法,我将如何执行此操作,却忘记了我插入了 @ 987654334@ 对象。输入一些内容作为答案,我会打勾并 +1 :)

标签: javascript object methods closures


【解决方案1】:

修复填充部分后,示例代码按预期工作:http://jsfiddle.net/4bL8T/

【讨论】:

    【解决方案2】:

    在执行此代码之前:

    (function () {
    var db = {
        com: [
            324: {
                unmod: "xyz"
            }
        ]
    };
    
    var report = {
        method: function () {
            var x = db.com[324].unmod;
        }
    };})();
    

    通过console.log检查db.com对象的范围,如果对象未定义,您需要在使用前定义它。

    【讨论】:

    • 很明显db.com是在例子内部定义的,所以在作用域内。
    • 好的,如果他们定义了,但在执行时他们未定义。 db.com 是全局变量吗?也许当我们尝试使用db.com 对象时,我们使用的不是全局变量。或者我们留在其他范围层。
    猜你喜欢
    • 2016-08-30
    • 2020-03-03
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多