2015-06-27 4 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 

Как я могу добиться, чтобы получить значение счетчика вне функции? Я попробовал почти все, от window до return, чтобы отделить functions.

Любой ключ?

Update

Я предпочитаю лучший дизайн, как этот

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 

Update 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''. Но когда я набираю '' counter'' в командной строке chrome dev tools, он отображает '' 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()); функция out (s) { document.getElementById ('out'). InnerHTML = '

' + s + '
'; } '', но дает мне '' Uncaught TypeError: Невозможно прочитать свойство 'onload' of undefined''. Я делаю что-то неправильно? Или я должен обернуть 'xobj.onload'' в другую функцию? –

+0

данные, которые вы извлекаете, являются асинхронными. проблема заключается в том, что вы обрабатываете данные, а данные не принимаются. –

1

Как @Nina Scholz отмечалось ранее, я извлечения Asynchron данных. Javascript начал рисовать dom до всех значений, загруженных.

Это фиксированная моя проблема:

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

Я жду документ, который будет готов, а затем добавить дополнительный тайм-аут в качестве буфера.

Смежные вопросы