简单的JavaScript问题

时间:2010-01-04 20:32:18

标签: javascript jquery

我有一个2000行的jquery文件,我把文件拆分成较小的文件,如果我在第一个文件中有一个函数,那个文件#2是指的,它就会出现未定义。

每个文件都包含在jquery ready函数中,执行此操作的最佳方法是什么?

7 个答案:

答案 0 :(得分:6)

如果有问题的函数是在ready处理程序的范围内声明的,那么任何其他代码都无法访问它,包括其他ready处理程序。

您需要做的是在全局范围内定义函数:

function foo()
{
    alert('foo');
}

$(document).ready(function()
{
    foo();
});

P.S。添加ready处理程序的更简洁方法是:

$(function()
{
   foo();
});

修改:如果您的每个分开的ready处理程序的内容依赖于前面的部分,那么由于上述原因,您无法拆分它们。更明智的做法是将大部分逻辑分解为独立函数,将它们放在ready事件处理程序之外的自己的文件中,然后从处理程序中调用它们。

修改:为了进一步说明,请考虑以下处理程序:

$(function()
{
    var foo = 'foo';
    var bar = 'bar';

    alert(foo);
    alert(bar);
});

我可能会把它分开:

$(function()
{
    var foo = 'foo';
    var bar = 'bar';
});

$(function()
{
    alert(foo);
    alert(bar);
});

问题在于foobar是在第一个处理程序中定义的,当它们在第二个处理程序中使用时,它们已经超出范围

这样的任何连续逻辑流都需要在同一范围内(在本例中为事件处理程序)。

答案 1 :(得分:2)

函数定义不应包含在另一个函数中。除非您真的希望该函数定义是私有的,否则不会。如果我理解正确,那不是你的意图。

只在jQuery ready函数中包装函数调用。

如果您担心自己的函数与第三方函数名称发生冲突,请将其命名为:

var myFunctions = {}
myFunctions.doThis = function () {}
myFunctions.doThat = function () {}

但实际上,如果您要为其他人创建mashup或库,您只需要担心这个问题。在您自己的网站上,您可以控制javascript中包含的内容。

答案 2 :(得分:1)

实际上,出于性能原因,最好将其保存在一个文件中;多个请求实际上可以占用更多带宽......但作为单独的文件,您需要按特定顺序对它们进行排序,以便存在逻辑顺序。每个脚本都定义一个方法,而不是在document.ready中包含所有内容,该页面将在其自己的document.ready处理程序中执行,以便您可以维护该顺序。

答案 3 :(得分:1)

很可能它未定义的原因是因为当你有单独的就绪调用时,这些调用中的代码范围是不同的。

我会重新组织我的代码。可以使用$ .extend直接将任何共享函数附加到jQuery对象。这就是我们为我们的应用程序所做的工作,它运作良好。

this question。希望它有所帮助。

答案 4 :(得分:0)

每个文件都不应具有就绪功能。只有一个文件应该具有就绪功能,并且应该是最后一个文件。

答案 5 :(得分:0)

函数在JavaScript中提供范围。您在jquery.ready中的代码是一个匿名函数,因此它不知道其他作用域。删除这些JavaScript函数的包装并将它们声明为常规函数,la

$(document).ready(function ()
{
   functionFromFile1();
   functionFromFile2();
};

答案 6 :(得分:0)

“包装在jquery ready函数中”只不过是将事件绑定到jQuery认为DOM准​​备就绪时触发的ready事件。

您应该只将依赖于DOM的方法绑定到ready事件。无论你做了多少绑定,所有方法最终都会以绑定顺序执行。