可能的变量吊装问题

时间:2014-01-13 17:32:52

标签: javascript hoisting

考虑这个JS(在body的末尾运行并导致错误)

(function(){
    "use strict";

    var div = document.getElementById("hook"),
        ul = div.firstElementChild,
        last_li = ul.lastElementChild;

    alert(div) // alerts "Uncaught TypeError: Cannot read property 'children' of undefined"  

})();

然后我删除了逗号并添加了var关键字,但收到了类似的错误(它不是HTML ):

(function(){
    "use strict";

    var div = document.getElementById("hook");
    var ul = div.firstElementChild;
    var last_li = ul.lastElementChild;

    alert(div) // alerts "Uncaught TypeError: Cannot read property 'lastElementChild' of undefined " 

})();

唯一可行的方法是在alert()分配后直接添加div语句。我认为这与变量吊装有关,但我没有足够的经验知道。

有人可以快速概述变量吊装以及可能发生的事情吗?谢谢!

1 个答案:

答案 0 :(得分:3)

这不是悬挂。

这里发生的事情如下:

(function(){
    "use strict";

    // this returns an element otherwise the next line would not work
    // that means the element is found in the DOM
    var div = document.getElementById("hook"), 
        // this returns the value `undefined` or `null` 
        ul = div.firstElementChild,
        // this is a TypeError, since `ul` is undefined
        last_li = ul.lastElementChild;

    alert(div) // we never actually get to this line
})();

你所拥有的元素可能没有元素(可能只是文本节点?)

这是fiddle reproducting the issue

这是fiddle where it works