Техника кодирования JavaScript или плохой код? - PullRequest
14 голосов
/ 03 ноября 2010

Во время отладки javascript, написанного кем-то другим, я наткнулся на код, который раньше не видел.Вот пример:

function doSomething() {
    //doing something here...
}

function doItNow() {
    //other logic...
    doSomething && doSomething();    // <=== What's this?
}

Цель 2-й строки в функции doItNow () проверить, существует ли doSomething, а затем вызвать его?Вот так:

function doItNow() {
    //other logic...
    if (doSomething) {
        doSomething();
    }
}

JSLint не нравится, и я бы предпочел, чтобы в моем приложении не было плохого кода.Есть идеи?

Ответы [ 3 ]

7 голосов
/ 03 ноября 2010

Это действительно «стенография».Правая сторона выполняется только тогда, когда левая сторона передается как оператор if().

Компилятор Google Closure и другие минификаторы используют это преимущество;если вы введете if(a) a(), это приведет к a&&a()


Вы можете сделать то же самое с ||, например:

if( !a ){
  alert('Not a');
}

можно записать как

a || alert('Not a');
6 голосов
/ 03 ноября 2010

Да, ваши два примера "эквивалентны", оператор && выполняет оценку короткого замыкания .

Если первое выражение операнда дает falsey значение (например, null, undefined, 0, NaN, пустая строка и, конечно, false), выражение второго операнда будет не , и еслизначение truey , будет выполнен вызов функции.

Но если doSomething не был объявлен, оба ваших примера завершатся неудачей .

Если на код ссылается идентификатор, который не объявлен и на который есть ссылка, вы получите ReferenceError исключение, например:

function foo() {
  undeclared && undeclared();
}

try {
  foo(); 
} catch (e) {
  alert(e);  // ReferenceError!
}

Если вы хотите:

  1. Убедитесь, чтоидентификатор существует, и
  2. Убедитесь, что он вызываемый

Вы можете:

if (typeof doSomething == 'function') {
  doSomething();
}

typeofОператор можно безопасно использовать для несуществующих идентификаторов. Кроме того, проверив, что doSomething является функцией, вы убедитесь, что сможете ее вызвать.

1 голос
/ 03 ноября 2010

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

...