我正在写一个计数器来计算一个对象,它看起来像这样:
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
如何在功能之外获得计数器值?我尝试了几乎所有内容,从window
到return
分隔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
答案 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;
答案 2 :(得分:1)
正如@Nina Scholz先前指出的那样,我正在异步检索数据。 Javascript开始在所有加载的值之前绘制dom。
这解决了我的问题:
if (document.readyState) {
setTimeout(function() {
var objLen = Object.keys(obj).length;
console.log(objLen);
}, 100);
}
我正在等待文档准备就绪,然后添加额外的超时作为缓冲区。