当我声明以下脚本时,我收到了js错误。
<script>
window.onload=init;
init = function(){alert("Yahoo!");}
</script>
当我将init声明为:
时,它可以正常工作 <script>
window.onload=init;
var init = function(){alert("Yahoo!");}
</script>
顶层init不应该隐式成为window对象的属性吗?请帮我理解这个概念。
答案 0 :(得分:3)
JavaScript在执行代码之前跟踪变量和函数声明。实际上,很多语言都是这样做的,所以习惯这是一件好事。
不,但跟踪分配。这算作执行代码。即使分配了未定义的变量,它也会成为window
的属性,而不是变量!与实际变量不同,它可以从window
中删除。
var i = 2;
n = 2;
delete window.i; //false
delete window.n; //true
因此,在将它们定义为变量之前,不能使用它们。相反,必须先定义它们,然后再使用它们。否则,它们将不会被定义。
//OK, but not recommended because init is now not a variable. It makes more sense to make init a variable instead.
init = function(){alert("Yahoo!");}
window.onload=init;
答案 1 :(得分:1)
<script>
window.onload=init;
var init = function(){alert("Yahoo!");}
</script>
这是由Javascript组织的(首先是变量声明):
<script>
var init;
window.onload=init;
init = function(){alert("Yahoo!");}
</script>
因此,init
用于onload
时会出现var
。
没有window
的人不包含变量声明,但是对init
属性的赋值。预处理期间不会更改分配。因此,找不到任何名为{{1}}的内容,执行失败。
答案 2 :(得分:0)
这与javascript引擎对函数进行两次传递有关。在第一次传递时,它将所有局部变量移动到函数的顶部,在第二次传递中它运行函数。
因此,当您使用init
定义var
时,它是一个局部变量,因此在第一遍中定义并在第二遍中成功运行。
我不确定我是否可以说清楚,但如果你想获得有关这个主题的更多信息,Michael S. Mikowski和Josh C. Powell在Single Page Web Applications中有很好的介绍。