html 事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码。

看一个简单的例子:

html:

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="test.js"></script>
</head>
<body>
    <a href="#" id="test" class="link test test" onclick="fn()">baidu.com</a>
</body>

js:

window.onload = function() {
    function fn(){
        console.log('fn');
    }
};

看起来,当我点击 a 标签的时候,应该有 log ‘fn’,然而实际上却是:

image

懵了一会儿,因为一般用 window.onload 不会出现这种问题,,,后来想了想明白了,因为 js高程-第三版-中 里是这么说的:

html 事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码。

而上面的 fn 定义在 window.onload 的回调里,处于局部作用域,所以无法访问到,所以把 fn 放到全局作用域就行了,例如:

<head>
    <meta charset="UTF-8">
    <title>Document</title>
     <script>
     function fn() {
         console.log('fn');
     }
     </script>
</head>

<body>
    <a href="#" id="test" class="link test test" onclick="fn()">baidu.com</a>
</body>

这样就 OK,或者把上面这个 script 放到 body 最后也是可以的,总结下就是:

html 事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码。

原文地址:https://www.cnblogs.com/xianshenglu/p/8205781.html