为什么JavaScript函数以这种方式工作? 因此,我对大多数静态类型语言都有很好的理解,主要是C和C++。但是当我进入javascript时,我注意到了一些让我恼火的事情

为什么JavaScript函数以这种方式工作? 因此,我对大多数静态类型语言都有很好的理解,主要是C和C++。但是当我进入javascript时,我注意到了一些让我恼火的事情,javascript,html,Javascript,Html,我学会了编写与内部HTML交互的函数: document.getElementById("SomeHTML").onclick = function(){ document.getElementById("AnotherHTML").innerHTML = "<p> Joe has a cat </p>"; } document.getElementById(“SomeHTML”).onclick=function(){ document.getElem

我学会了编写与内部HTML交互的函数:

document.getElementById("SomeHTML").onclick = function(){



    document.getElementById("AnotherHTML").innerHTML = "<p> Joe has a cat </p>";

}
document.getElementById(“SomeHTML”).onclick=function(){
document.getElementById(“另一个HTML”).innerHTML=“乔有一只猫”

”; }
这一切都很好,但有一个问题。我应该如何重用它并保持它的可读性?。。。从C++开始,我总是被教导用这种方式编写代码:

function MyFunc()
{
           document.getElementById("AnotherHTML").innerHTML = "<p> Joe has a cat </p>";
}

document.getElementById("SomeHTML").onclick = MyFunc();
函数MyFunc()
{
document.getElementById(“另一个HTML”).innerHTML=“乔有一只猫”

”; } document.getElementById(“SomeHTML”).onclick=MyFunc();

后一种代码更干净(至少对我来说),我可以重用该函数,但它不起作用。。。我能够在每种编程语言中以这种方式编写,但在javascript中它会产生错误。我不知道我错过了什么,我知道这很简单。有人能帮我理解为什么我不能用这种方式编写javascript函数吗?或者如果我能告诉我怎么做,因为我更喜欢后者而不是前者。提前谢谢你。

你真幸运!后一种代码也可以在JavaScript中使用

下面,我概述了使用更熟悉的语法实现这一点的三种不同方法

//要调用的函数
函数MyFunc(){
警惕(‘工作’);
}
//选项1(链接1)
document.getElementById(“一”).addEventListener(“单击”,MyFunc);
//备选方案2(链接2)
document.getElementById(“两个”).onclick=MyFunc



您的函数不太可重用,对我来说,我会使用另一种方法

//原始版本
函数MyFunc(){
document.getElementById(“另一个HTML”).innerHTML=“乔有一只猫”

”; } document.getElementById(“SomeHTML”).onclick=MyFunc(); //函数发生器 函数MyFunc_生成器(元素、html_内容){ 返回函数(){ element.innerHTML=html\u内容; } } myfunc=myfunc_生成器( document.getElementById(“另一个HTML”), “乔有一只猫” } document.getElementById(“SomeHTML”).addEventListener(“单击”,myfunc);
代码中有相当大的差异。 我们可以首先比较原始的
MyFunc
函数和
MyFunc\u生成器

第一个没有return语句,因此赋值
document.getElementById(“SomeHTML”).onclick=MyFunc();
将为id为“SomeHTML”的html元素的onclik处理程序赋值
undefined

“MyFunc_生成器”函数是一个函数,它返回一个函数作为其求值结果

生成器函数的执行结果是创建具有实值的专用函数,而不是泛型函数

本例中的赋值将创建一个函数(匿名),并将名称
myfunc
赋给它。该函数将等于您的值

您可以更改生成器的参数,以创建具有不同目标和/或不同内容的类似函数

显然,在这样一个简单的案例中付出的努力并不值得取得这样的结果,但如果您必须描述的策略非常复杂,那么收益将会增加


最后一点注意。处理函数对事件的赋值是不同的。在javascript中,首选的方式是使用

后一种代码也可以在javascript中使用。
。onclick=MyFunc()
将赋值
MyFunc()的结果也可以使用<代码> .OnCalk+MyFunc;。你也可以试试Type脚本游乐场来查看错误。Slai是正确的,而且讽刺的是,你建议的代码也不能在C++中工作。你必须把函数分配给处理程序,而不是它的执行结果(或者你必须返回一个函数作为你的评估的返回)。这是一种非常精巧的编写方法,但我会在它工作时使用我能得到的,我可以恢复该函数。非常感谢!@chree我们的好奇心,你觉得这有什么奇怪的?语法
func()
()
结尾通常表示函数调用。对于静态类型语言也是如此。另一方面,
foo=bar
不带括号,通常表示赋值。这是因为它位于另一个函数内,而不是函数itself@OptimusCrime他指的是在投票前的原始答案edit@chree你知道吗ed让自己认识到Javascript与C/C不同的可能性++