Javascript 为什么 object 属性 在 header 脚本中可以,但在 html 中未定义?

Javascript why is object property ok in header script but undefined in html?

第一个警报在加载时正确显示 "hello",但是当我单击按钮时,警报显示 "undefined" 完全相同 属性。

在 firefox quantum 上测试,从 uwamp 直接从文件,在 IE 和 edge 上测试。

<html>
    <head>
        <meta charset="UTF-8"/>
        <title>TestObjectProperty</title>
            <script type="text/javascript"> 

                lang = {
                    greeting: "Hello",
                    bye: "good bye!"
                };

                alert(lang.greeting); 
                //works fine, alert shows Hello

            </script>
    </head>
    <body >
        <button  onclick="alert(lang.greeting);">test lang</button>
        <!-- alert shows UNDEFINED -->
    </body>
</html>

我想我应该在单击按钮时显示 "Hello"。 感谢您的帮助。

问题是 lang 是当前元素的一个属性:

https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang

如果您这样做 onclick="console.log(lang)",您会看到它是一个空字符串。在 window 范围内显式定义 lang,或使用另一个变量名称,例如 _lang:

<html>
    <head>
        <meta charset="UTF-8"/>
        <title>TestObjectProperty</title>
            <script type="text/javascript"> 

                window.lang = {
                    greeting: "Hello",
                    bye: "good bye!"
                };

                alert(window.lang.greeting); 
                //works fine, alert shows Hello

            </script>
    </head>
    <body >
        <button  onclick="alert(window.lang.greeting);">test lang</button>
        <!-- alert should show "Hello" -->
    </body>
</html>

请参阅 this jsfiddle 进行演示。