2014-12-14 2 views
0

Я не понимаю, почему следующий код не работает.JS - переменная область и инициализация внутренней функции

var test=null; 
(function(){ 
var Class=... 
test=new Class(); 
})(); 
test.doSomething();// ERROR test is null 

Как я знаю, если я не объявляю переменную с использованием var, то чем js должен найти переменную за пределами текущей области (функции). Пожалуйста, скажите, что я делаю неправильно.

EDIT
Полный код:

var Application=null; 
    require(["Aqua","$"],function(Aqua,$){ 
     var Class = Aqua.Application.extend(); 
     Application = new Class(); 
    }); 
Application.do("aaa");//Application is null 

но следующие работы

var Application=null; 
    require(["Aqua","$"],function(Aqua,$){ 
     var Class = Aqua.Application.extend(); 
     Application = new Class(); 
     Application.do("aaa"); 
    }); 
+0

@ Jonast92 Это IIFE. * Сразу вызывается *. aka Synchrnous. –

+0

@ Jonast92 False, просто совершенно неправильно. – Scimonster

+0

Это работает для меня; можете ли вы опубликовать весь код? – Scimonster

ответ

2

Требовать это библиотека асинхронной зависимость и как таковой в нижней строке Application.do("aaa"); не находится в обратном вызове. Эта нижняя строка вызывается перед обратным вызовом require.js с запущенной частью Application = new Class();.

По этой причине вы решили это в своем нижнем примере.

+0

Спасибо за ваше время. Я знаю, что требуется асинхронная библиотека - она ​​загружает модули асинхронно. Но! Мы вызываем метод require(). Поэтому он должен быть выполнен первым. Пожалуйста, объясни. –

+0

Вы называете это первым, но это не значит, что он завершил выполнение, это может произойти параллельно. Он должен асинхронно получать ресурсы через AJAX. Подробнее можно узнать, прочитав об AJAX и о том, как это работает, или подход цикла событий JavaScript. Код обратного вызова ожидает в стеке выполнения JavaScript, пока Javascript не начнет активно работать, скажем, строки ниже вызова функции вызова, типа 'Application.do (« aaa »);'. Ключ в том, что require.js использует те объекты (AJAX и цикл событий) под обложками, чтобы делать что-то в «параллельном». –

+0

Благодарим вас за подробное объяснение. Я думал, что require() работает иначе. Теперь я понял. –

0

Может быть, вы делаете что-то неправильно в ellipsed части?

Это прекрасно работает для меня:

var test=null; 
(function() { 
    var Class = function() { 
     this.doSomething = function() { console.log('hey'); } 
    }; 
    test = new Class(); 
})(); 
test.doSomething();// prints hey 

Примечание вам нужно добавить this, так как это класс, и вы используете new

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