我不确定这个问题的名称,因为这几乎就是问题本身。 基本上我搞砸了一些代码并发现了一些我无法解释的东西。这是一个简化:
function foo (a, b) {
if (foo) {
console.log("foo is true");
} else if (!foo) {
console.log("foo is false");
}
}
foo();
这输出" foo是真的",但我不明白的是Js如何在不执行它的情况下评估函数(缺少();)以及如何在没有它的情况下执行它传递函数中定义的参数。 也许我应该说我真正知道的唯一语言是java。
答案 0 :(得分:4)
很简单:
函数只是具有内部[[Call]]方法的对象。
强制使用布尔值时,所有对象都会产生true
。
答案 1 :(得分:1)
在JavaScript中,函数是一个值(一个有点特殊的值,您可以使用()
运算符调用它)。在JavaScript中,在布尔上下文中计算时,以下值为“false”:
所有其他值均为“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。
答案 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);