Подтвердить что ты не робот

Return с несколькими значениями, разделенными запятыми

Возможный дубликат:
Синтаксис Javascript: что означает запятая?

Что возвращает этот шаблон? Как это работает?

return myfunc(), myobj.myvar = someobj.prop, myobj

Я раньше не сталкивался с этим шаблоном, но смотрел на Bing Maps Ajax Control и заметил этот шаблон несколько раз.

Как я понимаю, несколько значений не возвращаются. Так что же делает эта модель? Что возвращается? Какова эта скидка?

4b9b3361

Ответ 1

Это оператор запятой. Он оценивает свой левый операнд, отбрасывает результат, оценивает свой правый операнд и принимает его в качестве значения результата. Он ассоциативен слева направо, поэтому a, b, c оценивают a, затем b, затем c и принимают результат c качестве значения.

В вашем примере это точно так:

myfunc();
myobj.myvar = someobj.prop;
return myobj;

Некоторые люди действительно предпочитают делать что-то на одной линии, даже если для этого нет объективной причины. В приведенном вами примере нет никакой пользы, и на самом деле это сбивает с толку, поскольку похоже, что первые два бита относятся к значению, которое в конечном итоге будет возвращено, а это не так. (Я писал, что до того, как вы сказали нам, что это минимизированный код; очевидно, что неясность для людей - это проблема только исходного кода, а не минимизированного кода.)

Поскольку вы сказали, что это минификатор: очень малая возможная выгода, которую мог бы получить минификатор, есть, если он является частью условного блока: он может сохранить один или два символа. Если мы предположим, что длинная форма выглядела так:

if (someCondition) {
    myfunc();
    myobj.myvar = someobj.prop;
    return myobj;
}

... используя оператор запятой, минификатор может сделать это (63 символа):

if(someCondition)return myfunc(),myobj.myvar=someobj.prop,myobj

... а не это (65 символов):

if(someCondition){myfunc();myobj.myvar=someobj.prop;return myobj}

... без изменения функциональности кода, если ниже следует } или какой-либо другой соответствующий символ (или конец файла) для запуска автоматической вставки точки с запятой в конце. В противном случае это будет необходимо ; на первом, но это все еще сохраняет один символ.

Ответ 2

Оператор запятой оценивает (слева направо) выражения, а затем возвращает последний результат, который в этом случае будет оценкой myobj идентификатор.

Вы можете это устранить некоторые фигурные скобки, если это важно для вас...

if (true)
    ;// do something
else
    return myfunc(), myobj.myvar = someobj.prop, myobj

... в отличие от...

if (true)
    ;// do something
else {
    myfunc();
    myobj.myvar = someobj.prop;
    return  myobj;
}

Ответ 3

в вашем примере myobj должен быть возвращен туда, где каждая вещь перед выполнением

myfunc();
myobj.myvar = someobj.prop;
return myobj;