Что делает использование имени функции без скобок в операторе if в JavaScript?

Например:

function foo (parameter1, parameter2) {
    // does something
}

if (foo) {
    foo(parameter1, parameter2);
}

О вызове функции без скобок говорилось в другом вопросе (имеет ли значение JavaScript, если я вызываю функцию с круглыми скобками?), Но я все еще не понимаю, что делает приведенный выше код.

Я спрашиваю, потому что я пытаюсь понять, что if (drag) {..} делает в этом коде: https://andreasrohner.at/posts/Web%20Development/JavaScript/Simple-orbital-camera-controls-for-THREE-js/

3 ответа

Решение

Ваш код определяет глобальную функцию foo с двумя параметрами.

После этого есть оператор if, который проверяет, правдива ли foo (foo - ваша функция и, следовательно, правдива). Так он вызывает функцию foo. Но будьте осторожны, если foo не был определен, ваш код выдаст ReferenceError.

Намного лучший способ проверить, существует ли функция:

if (typeof foo === "function") { 
  // safe to use the function foo
} 

Этот код просто проверяет, является ли ~~ функция ~~ именем foo существует ~~, и поэтому безопасно звонить ~~.

С другой стороны, если вы делаете, если (foo()), код внутри этого блока if будет выполняться только если foo() возвращает что-то, равное true,

Само по себе не ясно, как этот код должен быть полезным. Может быть, с большим контекстом было бы ясно.

Рассмотрим эти варианты:

1. Функция foo никогда не определялся:

Если foo тогда не объявлено:

if(foo) {} 

является ошибкой ссылки Это падает.

2. Foo определен, но это не функция

foo может быть что угодно, так что если у вас есть foo это выглядит так:

let foo = true
if(foo) {
   foo()
}

Это ошибка, потому что вы пытаетесь вызвать что-то, что не является функцией.

Так что именно этот код пытается проверить? Он не будет вызывать функцию, если имя foo объявлен и равен некоторому ложному значению, как 0 или же undefined, но в других случаях это потерпит крах. Похоже, что он пытается защитить вас от ошибок, но на самом деле это не так, если только нет какого-то другого контекста, где имя объявлено, но может быть неопределенным.

Общий контекст, где foo будет гарантированно объявлен внутри функции, где foo это аргумент. Код будет иметь больше смысла в следующем примере:

someFunction(foo){
    if(foo) {
       foo()
    }
}

Здесь вы можете ожидать foo существовать, но вы все еще должны верить, что вызывающая сторона передала функцию. Это защитит от ситуации, когда вызываемый не передает аргумент. (т.е. звоню someFunction())

Другие вопросы по тегам