Javascript函数评估为变量

时间:2015-12-06 20:51:57

标签: javascript function if-statement

我不确定这个问题的名称,因为这几乎就是问题本身。 基本上我搞砸了一些代码并发现了一些我无法解释的东西。这是一个简化:

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

foo();

这输出" foo是真的",但我不明白的是Js如何在不执行它的情况下评估函数(缺少();)以及如何在没有它的情况下执行它传递函数中定义的参数。 也许我应该说我真正知道的唯一语言是java。

5 个答案:

答案 0 :(得分:4)

很简单:

  • 函数只是具有内部[[Call]]方法的对象。

  • 强制使用布尔值时,所有对象都会产生true

答案 1 :(得分:1)

在JavaScript中,函数是一个值(一个有点特殊的值,您可以使用()运算符调用它)。在JavaScript中,在布尔上下文中计算时,以下值为“false”:

  • 0
  • “”
  • 未定义
  • 的NaN

所有其他值均为“true”。因此,函数总是“真实”。

答案 2 :(得分:0)

它正在评估标识符foo当前引用的函数的引用。 JavaScript使用对象引用指向函数和变量,您可以很容易地更改它们。这允许您检查当前正在引用的功能。

答案 3 :(得分:0)

在Java中,您的代码不合法​​,因为参数签名必须与函数的参数签名匹配,该签名包括函数名称及其参数列表。

在Javascript中唯一重要的是函数的名称。 Javascript中没有重载。这是有道理的,因为Javascript的对象模型基于字符串 - >功能/属性地图。 Java的对象模型更复杂,更细致,这就是你可以进行重载的原因。

所以简而言之。 foo()将调用您的函数foo,其中a和b未定义。如果你用foo(5)调用它,那么它将是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 :(得分: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);

一样