为什么我的JavaScript函数有时"未定义"?

har*_*rpo 39 javascript

我调用我的JavaScript函数.为什么我有时会得到错误"myFunction是没有定义",当它定义?

例如.即使在这个例子中,我偶尔会得到'copyArray未定义':

function copyArray( pa ) {
    var la = [];
    for (var i=0; i < pa.length; i++)
        la.push( pa[i] );
    return la;
}

Function.prototype.bind = function( po ) {
    var __method = this;
    var __args = [];

    // Sometimes errors -- in practice I inline the function as a workaround.
    __args = copyArray( arguments );

    return function() {
        /* bind logic omitted for brevity */
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,copyArray 就在那里定义,因此这不能与脚本文件加载的顺序有关.

我一直在难以解决的情况下得到这个,其中调用函数位于应该在被调用函数之后加载的另一个文件中.但这是我能提出的最简单的案例,似乎也是同样的问题.

它不会100%发生,所以我怀疑某种与负载时序相关的问题.但我不知道是什么.

@Hojou:这是问题的一部分.我现在收到此错误的函数本身就是我的addLoadEvent,它基本上是公共库函数的标准版本.

@James:我理解,函数中没有语法错误.在这种情况下,也会报告语法错误.在这种情况下,我只得到'未定义'错误.

@David:这种情况下的脚本驻留在一个外部文件中,该文件使用页面头部中的普通<script src ="file.js"> </ script>方法引用.

@Douglas:有趣的想法,但如果是这样的话,我们怎么能永远叫有信心用户定义的函数?无论如何,我试过这个并没有用.

@sk:这种技术已在各种浏览器中测试过,基本上是从Prototype库中复制而来的.

Nil*_*oct 21

我没有在最新的Linux for Linux中定义此函数,尽管Chromium处理得很好.

在我的情况下发生的事情是我在一个前SCRIPT块,在定义函数有问题的块之前,按以下方式说明:

<SCRIPT src="mycode.js"/>
Run Code Online (Sandbox Code Playgroud)

(也就是说,没有结束标记.)

我必须以下列方式重新声明这个块.

<SCRIPT src="mycode.js"></SCRIPT>
Run Code Online (Sandbox Code Playgroud)

接下来的工作很好......很奇怪吧?

  • 我只是遇到了与IE9和Chrome 14相同的问题.后方的痛苦是.... (3认同)

Dav*_*lin 8

如果您只是在页面上包含脚本,则不可能发生这种情况.

当JavaScript代码开始执行时,"copyArray"函数应始终可用,无论它是在它之前还是之后声明 - 除非您使用依赖库动态加载JavaScript文件.如果是这种情况,时间存在各种各样的问题.