javascript: что такое two & ldquo; new & rdquo; оператор делает? [Дубликат]

Конечно, есть много таких подходов, как синхронный запрос, обещание, но из моего опыта я думаю, что вы должны использовать подход обратного вызова. Естественно, что асинхронное поведение Javascript. Итак, ваш фрагмент кода можно переписать немного иначе:

function foo() {
    var result;

    $.ajax({
        url: '...',
        success: function(response) {
            myCallback(response);
        }
    });

    return result;
}

function myCallback(response) {
    // Does something.
}
5
задан lexicore 5 November 2014 в 22:49
поделиться

3 ответа

Это совсем не часто, но это возможно; функция, возвращающая функцию:

function baz(){}
function foo(){return baz}

new new foo() instanceof baz // true
6
ответ дан elclanrs 25 August 2018 в 20:24
поделиться

Взгляните на раздел 13.2.2 [[Construct]] в спецификации. Точнее, шаг 9 алгоритма.

  1. Если Type (result) - Object, то возвращает результат.

Функции объекты, поэтому, если вы вернете функцию из функции и попытаетесь создать экземпляр последней функции с помощью new, вы вернете прежнюю функцию, а не новый объект. Но функции также являются конструкторами, поэтому вы можете new вернуть функцию.

function bar() {}
function foo() { return baz; }
new foo === bar; // true
2
ответ дан Ionuț G. Stan 25 August 2018 в 20:24
поделиться

Мне пришлось использовать 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'ов.

1
ответ дан lama12345 25 August 2018 в 20:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: