"范围"如何与HTML文档中的Javascript的多个脚本标记一起使用?

msh*_*ang 23 html javascript

我不太确定<script>标签之间发生了什么.例如,以下内容在Chrome中提供了参考错误和类型错误:

<html>
    <head>
    <script type="text/javascript">
        T.prototype.test = function() {
            document.write("a");
        }
    </script>
    <script type="text/javascript">
        function T() {}
        var v = new T();
        v.test();
    </script>
    </head>
    <body>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

但这有效:

<html>
    <head>
    <script type="text/javascript">
    </script>
    <script type="text/javascript">
        T.prototype.test = function() {
            document.write("a");
        }
        function T() {}
        var v = new T();
        v.test();
    </script>
    </head>
    <body>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

Esa*_*ija 15

上面的脚本在第一个例子中首先执行,所以它还不知道T,因此错误.

在第二个示例中,只要脚本标记被执行,T就可以很好地定义并且在任何地方都可以知道.这是由于函数声明被提升到顶部,无论顺序如何,它们始终可用.功能声明吊装在这里有更深入的解释

应用吊装后的第二个示例:

var v,
   T = function(){}; /* using comma like this is short-hand for: var v; var T = function(){}; */

T.prototype.test = function() {
        document.write("a");
    };

v = new T();
v.test();
Run Code Online (Sandbox Code Playgroud)

  • @mshang,不要这样做,有一个文件,其名称描述对象,其所有方法都应该在那里.没有理由让myobjectmethodspart1.js和myobjectmethodspart2.js ......让维护更加困难. (3认同)

Jim*_*lle 7

它们每个都在全局上下文中解析,但是按顺序.在考虑第二个脚本标记之前,将解析并执行整个第一个脚本标记.作为解析脚本的一部分,函数声明会提前识别,这就是为什么第二个工作原理而第一个工作原理不工作的原因.