Что делает использование имени функции без скобок в операторе if в JavaScript? - PullRequest
0 голосов
/ 08 декабря 2018

Например:

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 ]

0 голосов
/ 08 декабря 2018

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

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

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

if (typeof foo === "function") { 
  // safe to use the function foo
} 
0 голосов
/ 08 декабря 2018

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

Рассмотрим следующие варианты:

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())

0 голосов
/ 08 декабря 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...