Javascript:获取作用域变量

Javascript:获取作用域变量,javascript,scope,global-variables,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;

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

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
如何获得函数外部的计数器值?我尝试了几乎所有的方法,从
窗口
返回
到分离
函数

有线索吗

更新

我喜欢这样更好的设计

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


很抱歉,我想有一个示例代码会更容易。但真正的问题是:

我想你这里有几个问题

首先,您正在编写之前将
计数器设置为
0
。无论您做什么,即使使用起重机,它都将始终为
0

其次,您从不调用
foo
函数,因此您的
计数器
永远不会递增

第三,
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:
请注意,JSFIDLE不允许使用
document.write
,因此替换了该部分。

我认为这里有几个问题

首先,您正在编写之前将
计数器设置为
0
。无论您做什么,即使使用起重机,它都将始终为
0

其次,您从不调用
foo
函数,因此您的
计数器
永远不会递增

第三,
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: 请注意,JSFIDLE不允许使用
document.write
,因此替换了该部分。

函数myFunc(参数){
this.param=param;
this.foo=函数(){
var object=window.JSON.parse(this.param),
计数器=0,
我
用于(对象中的i){
计数器++;
}
返回计数器;
};
}
var foo=new myFunc('{“a”:99}');
out(foo.foo());
功能输出(s){
document.getElementById('out').innerHTML=''+s+'';
}
函数myFunc(参数){
this.param=param;
this.foo=函数(){
var object=window.JSON.parse(this.param),
计数器=0,
我
用于(对象中的i){
计数器++;
}
返回计数器;
};
}
var foo=new myFunc('{“a”:99}');
out(foo.foo());
功能输出(s){
document.getElementById('out').innerHTML=''+s+'';
}

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

这解决了我的问题:


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

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

这解决了我的问题:


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

这是一个糟糕的设计。实例不应修改全局(或外部)变量。如果您只想创建该构造函数的一个实例,则无需定义构造函数,请使用单例。“window.JSON.parse(data)”中的“data”是什么?@Vohuman更新了代码,这给了我
未定义的
data=this.param
?@Art713计数器循环通过的是一个JSON文件。我认为它对于特定的问题来说是不满足的,但是如果需要的话可以发布真实的代码,这是一个糟糕的设计。实例不应修改全局(或外部)变量。如果您只想创建该构造函数的一个实例,则无需定义构造函数,请使用单例。“window.JSON.parse(data)”中的“data”是什么?@Vohuman更新了代码,这给了我
未定义的
data=this.param
?@Art713计数器循环通过的是一个JSON文件。我认为这对于特定的问题来说是不够的,但是如果必要的话可以发布真实的代码。这不起作用,这就是我现在要做的。我用我真正使用的原始函数更新了我的问题。谢谢。我现在正在做这个
out(data.xobj.onload());函数out{document.getElementById('out').innerHTML=''+s+'';}
,但给了我
未捕获的类型错误:无法读取未定义的
的属性'onload'。我做错什么了吗?或者我应该在另一个函数中包装
xobj.onload
?您检索的数据是异步的。问题是,你处理了数据,却没有收到数据。这不起作用,这就是我现在要做的。我用我真正使用的原始函数更新了我的问题。谢谢。我现在正在做这个
out(data.xobj.onload());函数out{document.getElementById('out').innerHTML=''+s+'';}
,但给了我
未捕获的类型错误:无法读取未定义的
的属性'onload'。我做错什么了吗?或者我应该在另一个函数中包装
xobj.onload
?您检索的数据是异步的。问题是,你处理了数据,却没有收到数据。奇怪的事情发生了。写入或控制台日志仍显示
0
。但是当我在chrome dev tools命令行中键入
counter
时,它会显示
173
,这是正确的数字。奇怪的事情发生了。写入或控制台日志仍显示
0
。但是当我在chrome dev tools命令行中键入
counter
时,它会显示
173
,这是正确的数字。