2015-06-27 61 views
0

我正在寫一個計數器來計算對象獲取範圍的變量,它看起來像這樣:的Javascript:

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

+0

這是一個糟糕的設計。實例不應修改全局(或外部)變量。如果您只想創建該構造函數的一個實例,則不需要定義構造函數,即使用單例。 – undefined

+1

什麼是「window.JSON.parse(data)」中的「數據」? – Art713

+0

@Vohuman更新了代碼,這給了我'undefined'' –

回答

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,因此取代了一部分。

+0

奇怪的事情正在發生。寫入或控制檯日誌仍然顯示「0」。但是當我在chrome開發工具命令行輸入「counter」時,它會顯示「173」,正確的數字。 –

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>'; 
 
}
<div id="out"></div>

+0

這不起作用,這正是我現在要做的。我使用原來的功能更新了我的問題,這是我真正使用的功能。 –

+0

謝謝。我正在做這個''out(data.xobj.onload()); function out(s){ document.getElementById('out')。innerHTML ='

' + s + '
'; '',但給我''未捕獲的類型錯誤:無法讀取未定義的'onload'屬性。難道我做錯了什麼?還是應該在另一個函數中包裝''xobj.onload''? –

+0

您檢索的數據是異步的。問題在於,您處理數據並且未收到數據。 –

1

由於@Nina肖爾茨前面所指出的,我檢索數據asynchron。 Javascript開始在所有加載的值之前繪製dom。

這個固定我的問題:

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

我在等待該文件要準備好,然後添加一個額外的超時作爲緩衝。