有或没有括号的JavaScript调用函数有什么区别()

use*_*110 4 javascript function

所以一个简单的例子就是

function a() {
    alert("something");
}

anything.onclick = a; // this is without parentheses

anything.onclick = a(); // this is with parentheses 
Run Code Online (Sandbox Code Playgroud)

两者有什么区别?

还有一件事:如果我定义相同的函数,但这次返回false,它会起作用吗?

function a(){
    alert("something");
    return false;
}
Run Code Online (Sandbox Code Playgroud)

0x4*_*2D2 6

不同的是,a()当调用该函数a 函数.

console.log( a() ); // false
console.log(  a  ); // function() {...}
Run Code Online (Sandbox Code Playgroud)

为了明确在使用示例的第二部分时技术上发生了什么,让我们重新定义a如下:

a = function() {
    return 100;
};
Run Code Online (Sandbox Code Playgroud)

并设置事件处理程序:

anything.onclick = a();
Run Code Online (Sandbox Code Playgroud)

f()不仅调用函数,f还返回其返回值.因此,在为函数调用设置变量或对象属性时,将分配函数调用的返回值.所以上述陈述有效地等同于:

anything.onclick = 100;
Run Code Online (Sandbox Code Playgroud)

哪个没有意义,可能会导致错误.如果函数没有返回值,则其隐式返回值undefined.

但是,如果您设置的变量等于a 调用它,则与将常规函数表达式设置为该变量相同:

var a = function() { ... },
    b = a; // b = function() { ... }
Run Code Online (Sandbox Code Playgroud)

b会执行相同的操作a.

因此,在您的示例中,请使用第一个,因为它有意义!将函数调用的返回值赋给事件处理程序的唯一情况是函数是否返回另一个函数.例如:

var x = function(xyz) {
    return function() {
        console.log(xyz);
    };
};

anything.onclick = x("Hello World"); // = function() {
                                     //       console.log("Hello World");
                                     //   }
Run Code Online (Sandbox Code Playgroud)