了解顶级窗口属性

时间:2014-07-11 19:45:35

标签: javascript

当我声明以下脚本时,我收到了js错误。

 <script>
    window.onload=init;
    init = function(){alert("Yahoo!");}
</script>

当我将init声明为:

时,它可以正常工作
 <script>
    window.onload=init;
    var init = function(){alert("Yahoo!");}
</script>

顶层init不应该隐式成为window对象的属性吗?请帮我理解这个概念。

3 个答案:

答案 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中有很好的介绍。