说我有以下内容:
<script>
var foo = {myFunc:function(){..some func}};
window.addEventListener('load',foo.myFunc(),false);
var bar = 'some var';
</script>
window.addEventListener
是否始终能够将foo.myFunc()
设置为调用加载事件的函数?在设置事件监听器时,foo是否有undefined
的可能性?何时创建foo
和bar
,何时可以使用?
我只定位Safari 5.0 +
答案 0 :(得分:1)
是的,在您的事件处理程序执行时,将定义foo
和bar
。
通常,JavaScript会逐行同步执行。它从顶部开始,向下工作。但是,这是一个特例,因为你在讨论变量声明。在变量和函数声明的情况下,"hoisting"发生。功能上发生的事情是你写的:
var foo, bar;
foo = ...;
window.addEventListener(...);
var bar = ...;
因此,显然可以保证定义foo
,bar
也是如此。{{1}}。这两个变量都将由函数关闭,并在执行时可用。
答案 1 :(得分:1)
变量定义被“提升”到给定范围的顶部,因此无论在何处声明变量,它都将在任何代码在该特定范围内运行之前存在。
变量赋值按照javascript文件中的顺序执行。
因此,foo
将存在,但在赋值语句运行之前不会有其值。
此外,您的代码应为此(在myFunc之后删除parens):
window.addEventListener('load', foo.myFunc, false);
当包含parens时,会立即调用该函数并传递其返回值。如果您只想传递对该函数的引用,以便addEventListener()
可以稍后调用它,那么您不需要包含该parens。