2015-12-06 2 views
0

Я не был уверен, как назвать этот вопрос, поскольку это почти сам вопрос. В основном я возился с каким-то кодом и нашел то, что я не могу объяснить. Вот упрощение:Оценка функции Javascript как переменной

function foo (a, b) { 
    if (foo) { 
     console.log("foo is true"); 
    } else if (!foo) { 
     console.log("foo is false"); 
    } 
} 

foo(); 

Это выводит «Foo правда», но то, что я не понимаю, как Js оценки функции без его выполнения (отсутствие();), и как я могу выполнить его даже без прохождения параметров, определенных в функции. Возможно, я должен сказать, что единственным языком, который я действительно знаю, является java.

+0

потому что функция truthy ... http://stackoverflow.com/questions/28571451/equality-of -truthy-and-falsy-values-javascript – epascarello

+0

'foo' - это имя функции, поэтому по логике это не' undefined', поэтому оно должно существовать (или быть 'true') –

+0

JS не нужно оценивать/вызывать функцию в вашем примере , Вы можете рассматривать функцию в JS как объект, но с дополнительной функцией - возможностью вызова. Обратите внимание: 'if (foo)' что-то другое, чем 'if (foo())' – xersiee

ответ

0

Он оценивает ссылку на функцию, на которую ссылается идентификатор foo. JavaScript использует ссылки на объекты для указания на функции и переменные, которые вы можете легко изменить. Это позволяет вам проверить, какую функцию вы сейчас ссылаетесь.

1

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

  • ложной
  • ""
  • неопределенными
  • нуль
  • NaN

Все остальные значения являются «истинными». Поэтому функция всегда «истинна».

+0

Хорошо, что имеет смысл, но в этом случае нет абсолютно никаких условий, которые заставили бы этот код запускать блок «else if», не так ли? – Gryxs

+0

Нет. Если вы не проверяете логическое значение функции, как вы это делаете (сам объект функции, а не значение, возвращаемое при вызове). Это всегда так. –

0

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

В Javascript единственное, что имеет значение, это имя функции. В Javascript нет перегрузки. Это имеет смысл, поскольку объектная модель Javascript основана на строках -> функциях/свойствах. Объектная модель Java более сложна и нюансирована, поэтому вы можете выполнять перегрузку.

Итак, короче говоря. foo() будет вызывать вашу функцию foo, а a и b не определены. Если вы вызываете его с foo(5) a, это будет 5, а b будет неопределенным. Если вы вызвали его с foo(5, 1, 3) a, это будет 5, b будет 1 и 3 будут игнорироваться. Я бы предположил, что вы, вероятно, можете получить третий аргумент, используя переменную аргументов Javascript. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments

Поскольку a и b не определены в вашем примере, они вычисляют значение false. Когда вы оцениваете if (foo), вы передаете объект функции в условие if(), и определенные объекты всегда оценивают значение true. null и undefined оба оцениваются как false.

All falsey values in JavaScript

4

Это просто:

  • функции только объекты с внутренним [[Call]] метод.

  • Все объекты производят true при принуждении к булевым.

0

В javascript вам не требуется передавать какие-либо аргументы функции. Когда аргумент не передается, значение этого аргумента считается неопределенным. Он также печатает "foo is true", потому что foo определяется как функция foo. Вы можете видеть, что происходит, выполнив следующие действия

function foo (a, b) { 
    console.log(typeof a); 
    console.log(typeof b); 
    console.log(typeof foo); 
} 

foo(); 

//it prints: 
//undefined 
//undefined 
//function 

В основном называя foo(); это как вызов foo(undefined,undefined);