Javascript:获取范围变量

时间:2015-06-27 19:53:06

标签: javascript scope global-variables

我正在写一个计数器来计算一个对象,它看起来像这样:

function myFunc(param) {
  this.param = param;

  param.foo = function() {
    var object = window.JSON.parse(data);
    for (i in object) {
      counter++;
    }
  }

}

var foo = new myFunc('data.json');
var counter = 0;
document.write(counter); // displays 0

如何在功能之外获得计数器值?我尝试了几乎所有内容,从windowreturn分隔functions

有任何线索吗?

更新

我更喜欢像这样的更好的设计

function myFunc(param) {
  this.param = param;

  param.foo = function() {
    var object = window.JSON.parse(data);
    var counter = 0;
    for (i in object) {
      counter++;
    }
    return counter;
  }

}

var foo = new myFunc('data.json');
document.write(counter); // displays undefined

更新2

很抱歉,我觉得拥有一个示例代码会更容易。但这是真实的:https://gist.github.com/BobWassermann/e709ec303477a015b609

3 个答案:

答案 0 :(得分:2)

我认为你在这里有几个问题。

首先,您在写作之前将counter设置为0。无论你做什么,它总是0,即使是吊装也是如此。

其次,您永远不会调用foo函数,因此counter永远不会增加。

第三,param.foo不公开。我想你希望它是this.foo = function(){ ... }

以下是我通过调整发布的代码的简化版本:

var counter = 0;
var foo;

function myFunc() {
  this.foo = function() {
    counter = 1000;
  }
}

foo = new myFunc();
foo.foo();
document.write(counter);

JSFiddle:http://jsfiddle.net/dgrundel/2ojw2332/2/ 请注意,JSFiddle不允许document.write,因此替换了该部分。

答案 1 :(得分:2)



function myFunc(param) {
    this.param = param;
    this.foo = function () {
        var object = window.JSON.parse(this.param),
            counter = 0,
            i;
        for (i in object) {
            counter++;
        }
        return counter;
    };
}
var foo = new myFunc('{"a":99}');
out(foo.foo());

function out(s) {
    document.getElementById('out').innerHTML = '<pre>' + s + '</pre>';
}
&#13;
<div id="out"></div>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

正如@Nina Scholz先前指出的那样,我正在异步检索数据。 Javascript开始在所有加载的值之前绘制dom。

这解决了我的问题:

if (document.readyState) {
  setTimeout(function() {
    var objLen = Object.keys(obj).length;
    console.log(objLen);
  }, 100);
}

我正在等待文档准备就绪,然后添加额外的超时作为缓冲区。