Конечно, есть много таких подходов, как синхронный запрос, обещание, но из моего опыта я думаю, что вы должны использовать подход обратного вызова. Естественно, что асинхронное поведение Javascript. Итак, ваш фрагмент кода можно переписать немного иначе:
function foo() {
var result;
$.ajax({
url: '...',
success: function(response) {
myCallback(response);
}
});
return result;
}
function myCallback(response) {
// Does something.
}
Это совсем не часто, но это возможно; функция, возвращающая функцию:
function baz(){}
function foo(){return baz}
new new foo() instanceof baz // true
Взгляните на раздел 13.2.2 [[Construct]] в спецификации. Точнее, шаг 9 алгоритма.
blockquote>
- Если Type (result) - Object, то возвращает результат.
Функции объекты, поэтому, если вы вернете функцию из функции и попытаетесь создать экземпляр последней функции с помощью
new
, вы вернете прежнюю функцию, а не новый объект. Но функции также являются конструкторами, поэтому вы можетеnew
вернуть функцию.function bar() {} function foo() { return baz; } new foo === bar; // true
Мне пришлось использовать new new
при использовании объекта в качестве пространства имен. Хотя будет более приятным:
Вместо:
var Namespace = function() {
var ClassFirst = this.ClassFirst = function() {
this.abc = 123;
}
var ClassSecond = this.ClassSecond = function() {
console.log("Cluttered way to access another class in namespace: ", new new Namespace().ClassFirst().abc);
console.log("Nicer way to access a class in same namespace: ", new ClassFirst().abc);
}
}
new new Namespace().ClassSecond()
Сделайте это:
var Namespace = new function() {
var ClassFirst = this.ClassFirst = function() {
this.abc = 123;
}
var ClassSecond = this.ClassSecond = function() {
console.log("Cluttered way to access another class in namespace: ", new Namespace.ClassFirst().abc);
console.log("Nicer way to access a class in same namespace: ", new ClassFirst().abc);
}
}
new Namespace.ClassSecond()
Не имеет прямого отношения к вопросу, но я был googling new new javascript
, потому что он выглядел довольно уродливым и неправильным. Этот пост может помочь избежать этого ненужного создания объекта для других new new
Google'ов.