为什么我的JavaScript函数有时是;未定义“;?

为什么我的JavaScript函数有时是;未定义“;?,javascript,Javascript,我调用JavaScript函数。为什么在定义myFunction时有时会出现错误“myFunction未定义” 比如说。即使在本例中,我偶尔也会看到“copyArray未定义”: function copyArray( pa ) { var la = []; for (var i=0; i < pa.length; i++) la.push( pa[i] ); return la; } Function.prototype.bind = funct

我调用JavaScript函数。为什么在定义myFunction时有时会出现错误“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 */
    }
}
函数copyArray(pa){
var la=[];
对于(变量i=0;i
正如您所看到的,copyArray就是在这里定义的,所以这与脚本文件的加载顺序无关

我在更难处理的情况下遇到过这种情况,调用函数位于另一个文件中,该文件应该在被调用函数之后加载。但这是我能提出的最简单的案例,似乎也是同样的问题

这种情况并非100%都会发生,因此我怀疑存在某种与加载时间相关的问题。但我不知道是什么

@这就是问题的一部分。我现在得到这个错误的函数本身就是我的addLoadEvent,它基本上是公共库函数的标准版本

@詹姆斯:我明白,函数中没有语法错误。在这种情况下,也会报告语法错误。在这种情况下,我只得到“未定义”错误

@David:本例中的脚本驻留在一个外部文件中,该文件使用页面标题部分中的普通方法引用

@道格拉斯:这个想法很有趣,但如果是这样的话,我们怎么能自信地调用用户定义的函数呢?不管怎么说,我试过了,但没有成功


@sk:这项技术已经在各种浏览器中进行了测试,基本上是从库中复制的。

我的猜测是,在调用该方法时,文档并没有完全加载。让您的代码在文档就绪事件后执行。

函数中的语法错误或其上面的代码中的语法错误可能导致未定义。

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


当JavaScript代码开始执行时,“copyArray”函数应该始终可用,无论它是在之前还是之后声明的——除非您使用依赖项库动态加载JavaScript文件。在这种情况下,计时会出现各种各样的问题。

使用匿名函数来保护本地符号表。比如:

(function() {
    function copyArray(pa) {
        // Details
    }

    Function.prototype.bind = function ( po ) {
        __args = copyArray( arguments );
    }
})();

这将创建一个闭包,将函数包含在本地符号表中,当你调用函数时,你不必依赖于它在全局名称空间中的可用性。

如果你正在更改内置“函数”对象的原型,那么通过修改一个基本的内置对象,你可能会遇到浏览器错误或争用情况


在多个浏览器中对其进行测试。

恐怕,当您向函数类添加新方法(通过PRTOTYPE)时,实际上是将其添加到所有声明的函数以及copyArray()。结果,copyArray()函数得到递归自引用。也就是说,应该存在copyArray().bind()方法,该方法正在调用自身

在这种情况下,某些浏览器可能会阻止您创建此类引用循环,并引发“函数未定义”错误


在这种情况下,内联代码将是更好的解决方案。

这并不能解决您原来的问题,但您始终可以将对
copyArray()的调用替换为:

__args = Array.prototype.slice.call(arguments);
有关更多信息,请访问


我已经在以下浏览器中测试了上述内容:IE6、7和8B2、Firefox 2.0.0.17和3.0.3、Opera 9.52、Safari for Windows 3.1.2和Google Chrome(无论本文发布时的最新版本是什么),它可以在所有浏览器中运行。

用验证您的代码。它通常会发现大量的小错误,因此“JSLint可能会伤害您的感情”的警告非常恰当。=)

虽然Chromium可以很好地处理这个函数,但在最新的Firefox for Linux中,这个函数并没有被识别出来

在我的例子中,在定义有问题的函数的块之前,我有一个前
脚本
块,如下所述:

<SCRIPT src="mycode.js"/>

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

我不得不用下面的方法重新申报这个街区

<SCRIPT src="mycode.js"></SCRIPT>


然后接下来的工作很好。。。奇怪吧?

使用框架集时可能会发生这种情况。在一个框架中,定义了我的变量和方法。在另一个例子中,他们不是。当使用调试器并看到我的变量已定义,然后在帧内的断点处未定义时,这尤其令人困惑。

这可能已得到纠正,但。。。显然firefox存在缓存问题,这是javascript函数无法识别的原因。。我真的不知道具体细节,但如果您清除缓存,将解决问题(直到缓存再次填满…不是一个好的解决方案)。。我一直在四处寻找firefox是否有一个真正的解决方案,但到目前为止还没有。。。哦,不是所有的版本,我认为可能只有一些3.6.x版本,不确定…

我认为您的javascript代码应该放在标记之间,需要通过删除“异步”加载来解决文档加载问题:


更改为:

  <script type="text/javascript" src="{% static 'js/my_js_file.js' %}"></script>


如果是这样的话,它永远不会起作用。偶尔的失败不能用语法错误来解释。只是出于好奇。。。在帧/IFRAMEs/弹出窗口内外执行脚本时遇到此错误的页面是否存在?嗯。。。没有涉及iFrame或弹出窗口。谢谢提示。我可以在很多地方使用它。然而,我实际上只是在使用这个函数
  <script type="text/javascript" src="{% static 'js/my_js_file.js' %}"></script>