【发布时间】:2013-10-23 21:28:30
【问题描述】:
<script type="text/javascript">
function BigComputer(answer) {
this.the_answer = answer;
this.ask_question = function () {
alert(this.the_answer);
}
}
function addhandler() {
var deep_thought = new BigComputer(42),
the_button = document.getElementById('thebutton');
the_button.onclick = deep_thought.ask_question;
}
window.onload = addhandler;
</script>
为什么这个脚本返回 undefined 而不是 42?
我是这样理解的:
1) 在网页加载时,我们运行“addhandler”方法。
2) 在这个方法中,我们为 deep_thought 变量创建 BipComputer 的实例。我们还在答案中设置了 42(BipComputer 类中的公共变量)
3) 然后我们为按钮设置引用(在 html 文件中)
4) 按钮在点击时激活,神奇之处来了:
我认为应该打印出数字 42,因为我们只是在第 2 步中为此进行了设置,但是变量是“未定义”?
另一个问题是,在没有 ()(没有要传递的参数时)和使用 () 的情况下运行方法有什么区别。 [类似于 addhandler 方法]。
也许这个问题很简单,但我以前用java和php编程,现在面向javascript编程的思维方式对我来说很奇怪。函数看起来像类,类看起来像函数,没有真正的构造函数之类的东西。
不过没关系,让我们回到问题上来:)
非常感谢任何帮助。
@编辑
感谢@lbstr,我找到了有用的链接,适用于与我提出相同问题的每个人。 http://web.archive.org/web/20080209105120/http://blog.morrisjohns.com/javascript_closures_for_dummies
【问题讨论】:
-
addhandler 在该示例中的任何地方都没有被显式调用。它作为对
window.onload的引用传递给浏览器在适当的时间调用。唯一可以在没有()的情况下执行函数的情况是当您将其作为构造函数调用时。 -
@zzzzBov — 该函数被添加为按钮的单击侦听器,因此它被按钮的单击处理程序调用。
-
@RobG,让我重新表述一下,只有在没有
()的情况下才能显式执行一个函数,就是将它作为构造函数调用(即new Foo)。任何其他情况都需要调用浏览器函数或行为来为您调用该函数。
标签: javascript oop methods event-handling