函数在lol外部定义时不起作用的原因是,当 JavaScript 首次运行时,DOM尚未加载。因此,getElementById将返回null(参见 MDN)。
您已经找到了最明显的解决方案:通过getElementById在函数内部调用,DOM 将在函数被调用时加载并准备好,并且元素将像您期望的那样被找到。
还有其他一些解决方案。一种是等到整个文档加载完毕,像这样:
<script type="text/javascript">
    var lolz;
    function onload() { 
        lolz = document.getElementById('lolz');
    }
    function kk(){
        alert(lolz.value);
    }
</script>
<body onload="onload();">
    <input type="text" name="enter" class="enter" value="" id="lolz"/>
    <input type="button" value="click" onclick="kk();"/>
</body>
注意标签的onload属性<body>。(附带说明:标签的language属性<script>已被弃用。不要使用它。)
但是,存在一个问题onload:它会等待所有内容(包括图像等)加载完毕。
另一种选择是等到 DOM 准备好(通常比 早得多onload)。这可以使用“普通”JavaScript 来完成,但使用像jQuery这样的 DOM 库要容易得多。
例如:
<script type="text/javascript">
    $(document).ready(function() {
        var lolz = $('#lolz');
        var kk = $('#kk');
        kk.click(function() {
            alert(lolz.val());
        });
    });
</script>
<body>
    <input type="text" name="enter" class="enter" value="" id="lolz"/>
    <input type="button" value="click" id="kk" />
</body>
jQuery 的.ready()将函数作为参数。该函数将在 DOM 准备好后立即运行。第二个示例也使用.click()来绑定 kk 的onclick处理程序,而不是在 HTML 中进行内联。