我正在写一个计数器来计数一个对象,它看起来像这样:
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
我认为您有几个问题。
首先,在编写之前将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
,因此更换了该部件。
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>';
}
<div id="out"></div>
正如@Nina Scholz之前指出的,我正在异步检索数据。Javascript在加载所有值之前就开始绘制dom。
这解决了我的问题:
if (document.readyState) {
setTimeout(function() {
var objLen = Object.keys(obj).length;
console.log(objLen);
}, 100);
}
我正在等待文档准备就绪,然后添加一个额外的超时作为缓冲。