Javascript 函数以及何时使用括号/括号

Javascript 函数以及何时使用括号/括号,javascript,Javascript,我是javascript新手,很难理解为什么/何时使用括号/括号 如果你有一个叫clicker的按钮,你可以写 document.getElementById("clicker").onclick=function(){ alert("Hi") } 函数具有() 但是 myFunction没有(),或者无法工作(在加载页面时显示警报,而不是单击) myFunction没有() 哦,是的,是这样的: function myFunction(){ //

我是javascript新手,很难理解为什么/何时使用括号/括号

如果你有一个叫clicker的按钮,你可以写

    document.getElementById("clicker").onclick=function(){
        alert("Hi")
    }
函数具有() 但是

myFunction没有(),或者无法工作(在加载页面时显示警报,而不是单击)

myFunction没有()

哦,是的,是这样的:

function myFunction(){
//                 ^^ right here
    alert("Hi")
}
通过用函数定义替换变量,您可以轻松验证这两个示例是否等效:

function myFunction(){
    alert("Hi")
}
document.getElementById("clicker").onclick = myFunction;

// substitute "myFunction"

document.getElementById("clicker").onclick = function myFunction(){
    alert("Hi")
};

// remove function name 

document.getElementById("clicker").onclick = function(){
    alert("Hi")
};
看,我们没有碰任何
()
。通过简单地用变量的值替换变量,我们可以将第二个示例转换为第一个示例


您似乎在函数定义中混用了括号:

function foo() { ... }
            ^^
括号用于调用函数:

foo();
   ^^
这是两种不同类型的括号,在两个示例中都没有使用第二种括号(这是正确的)

让我们看看如果我们用
myFunction()
进行上述替换会发生什么:

注意最后一行中的悬空
()
?这看起来不像你的第一个例子。因此,您可以看到调用函数并不等同于定义函数

myFunction()
在常规代码中使用myFunction()时,它始终是执行函数的调用,括号中可能包含函数参数的一组输入

function myFunction()
document.getElementById("clicker").onclick = myFunction;
声明函数时,括号表示定义的参数列表。如果它们为空,则表示没有参数

function myFunction()
document.getElementById("clicker").onclick = myFunction;
设置元素的onclick属性时,它需要对函数的引用。这允许它在实际的onclick事件触发后使用引用执行函数。如果包含括号,它会尝试立即执行函数,然后将onclick设置为函数返回的结果

<button id="clicker" onclick="myFunction()">Click Me!</button>
其中function()是匿名函数的声明

<button id="clicker" onclick="myFunction()">Click Me!</button>

是一个可以帮助您更好地理解函数的参考。

在JavaScript中,函数是一级公民,简而言之,这意味着函数可以像正则变量一样工作

考虑:

var x = 5; // x holds a reference to 5
foo(x); // Send whatever is inside x to foo, so it may do something with it.
同样,我们可以这样做:

// Again, x holds a reference to something
var x = function () {
    console.log("hello");
}
foo(x); // And again, we send that something into foo
在第二个示例中,
x
function(){…}
是相同的。写一个和写另一个是一样的,就像第一个例子中的
x
“真的是”数字5,第二个例子中的
x
“真的是”函数

现在,当我们想要一个函数运行时,我们使用引用+括号来调用它。 请考虑这些例子,它们都是相同的:

// foo is the reference to the function, just like x was. 
// and we call it with parenthesis:
function foo () 
{
    console.log("Hello");
}
foo(); // Logs "hello".

// reference to function (still foo) + parenthesis
var foo = function () 
{
    console.log("Hello");
}
foo(); // Logs "Hello"

// Now: A function is called by a reference to a function followed by parenthesis
// So, we can also do this rather nifty thing:
function foo () 
{
    console.log("Hello");
}()
// A reference to a function, followed by parenthesis! 

因此,正如其他人指出的那样,简短的回答是,在声明函数和调用函数时使用括号,而不是在传递引用时使用括号

“…您的两个示例都没有使用第二个示例”没有,但这意味着OP在第二个示例的某个阶段尝试在
myFunction
之后添加
()
。@T.J.Crowder:True,扩展了一点。我投票结束这个问题,因为它在每个/任何编程教程的第一页。@Mathletics是吗?因为我能找到的每一个/任何初学者教程都会谈到使用name()调用函数(即使不传递参数,也总是以括号结尾)。只有经过大量的探索,我才开始理解。@Mathletics:真的吗?使用函数引用并不完全是“在第一页”,谢谢。我以为括号调用的函数与引用它的函数不同,然后我想到了下面的方法,它不会立即调用函数。所以还是有点困惑。。。点击我!函数saySomething(){alert(“Hi”)}使用HTML标记onclick属性解释更新了答案。