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

时间:2013-01-28 18:05:59

标签: javascript function

所以一个简单的例子就是

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

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

anything.onclick = a(); // this is with parentheses 

两者有什么区别?

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

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

3 个答案:

答案 0 :(得分:6)

区别在于a()调用该函数,而a 函数。

console.log( a() ); // false
console.log(  a  ); // function() {...}

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

a = function() {
    return 100;
};

并设置事件处理程序:

anything.onclick = a();

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

anything.onclick = 100;

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

但是,如果你设置的变量等于a 而没有调用它,那么它就像将常规函数表达式设置为该变量一样:

var a = function() { ... },
    b = a; // b = function() { ... }

b将执行与a相同的操作。

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

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

anything.onclick = x("Hello World"); // = function() {
                                     //       console.log("Hello World");
                                     //   }

答案 1 :(得分:1)

指定参考:

anything.onclick = a; //assigns a reference

您的功能是:

anything.onclick = function() { 
    alert("something"); 
}

执行方法并分配返回的结果

anything.onclick = a(); //calls the method and assigns whatever is returned.

您的功能是:

anything.onclick = false; 

答案 2 :(得分:0)

函数末尾的括号是js引擎执行该函数的权限。如果您不提供,则根本不会执行。

x = a()//如果你这样做,你正在调用函数,但如果你只是传递“a”,你传递一个指向函数的指针