Что делает использование имени функции без скобок в операторе 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()
)