4

所以一个简单的例子是

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;
}
4

3 回答 3

7

不同的是a()调用函数whilea 函数。

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");
                                     //   }
于 2013-01-28T18:08:58.157 回答
2

分配参考:

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; 
于 2013-01-28T18:09:12.810 回答
0

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

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

于 2013-01-28T18:10:20.310 回答