2013-12-16 3 views
1

Я наткнулся на этом кусок JS коды на уменьшенную библиотеки, которая загадочный меня:понимать уменьшенную Javascript код

... 
return e.input || L(), e.addTest = function(a, b) { 
... 

я играл с ним на jsFiddle без особого везения понимания того, что происходит.

Я хотел бы знать:

  1. , когда она вернется? всегда очевидно.
  2. что он возвращает? на мой тест он возвращает неопределенные ... почему?
  3. Когда выполняется код L()? Только если e.input возвращает false?
  4. когда есть e.addTest комплект? по моему тесту всегда ... почему?
+1

Что именно вы хотели бы знать? Что такое 'e.input || L() 'или почему есть запятая после' L() '? – VisioN

ответ

5

1. Когда он возвращается?
всегда.

2. Что он возвращает? на мой тест он возвращает неопределенный ... почему?
если вы оповещения alert он предупреждает undefined

3. когда) выполняется код L (?
если e.input возвращает ложь

4. когда это e.addTest набор?
Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.

Это unminified код в вашем случае:

if (e.input){ 
    L(); 
} 
e.addTest = function(a, b) {}; 
return e.addTest; 
+0

+1 Я даже не видел запятую как оператора. Спасибо за это объяснение. –

+0

+1 То же самое здесь. Это удобно. – Turnsole

+0

Исправьте меня, если я ошибаюсь :), но я думаю, что вы допустили ошибку в своем последнем ответе. Если оператор запятой оценивает оба операнда, не следует ли всегда задавать e.addTest? Кажется, это то, что происходит на моих тестах. – jvilhena

1

Ваш код полностью неполный ..

За помощью уменьшенной коды вы можете использовать this сайта, они поворачиваются Минимизированный код в развернутом код, который значительно легче читать.

1

Я думаю, что это означает, что если е не определено или ложным, а затем вернуться L(), в противном случае возвращают e.addTest (где определяется e.addTest следующим образом).

ETA: только что увидел ваши правки. A1rPun объясняет это хорошо.

3

Предполагая, что ваш код выглядит следующим образом:

return e.input || L(), e.addTest = function(a, b) { 
    ... 
} 

Этот код:

  1. Оценка e.input || L()
    • Это означает, что L будет работать, если e.input не falsy (undefined, 0, false, null, пустой строка)
  2. Оценка e.addTest = function(a, b) { ... }
    • Это сохраняет новую функцию в e.addTest
    • Затем урожаи, которые действуют для всего выражения, так что функция возвращается

Вы можете думать об этом as:

return ((e.input || L()), e.addTest = function() { ... }) 

, где выполняется операция ||, а затем операция присвоения.

Это потому, что:

  • Оператор || коротка-circuting, и даст его первый не-falsy операнд
    • Так return a || b возвращается a если a является truthy или иначе возвращает b
  • Оператор , оценивает оба операнда слева и справа, но затем дает право o perand
    • Так return a(), b() работает как a() и b(), но возвращает результат b()
  • Операция присваивания дает значение, присвоенное
    • Так return a = 5 будет хранить 5 в a, а затем вернуться 5

В вашем случае вы видите undefined, потому что возвращаемое значение alert всегда undefined.

+0

Он всегда возвращает функцию, даже если 'e.input' является правдивой. У меня +1, потому что вы добавили некоторые вещи, которые я не объяснил. – A1rPun

+0

@ A1rPun Спасибо, отредактирован, чтобы исправить соответствующий приоритет '||' и ','. – apsillers

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