10

我有一个冗长的 JavaScript 文件,它通过 JSLint,除了“在定义之前使用”错误。

我使用了正常的函数声明,如...

function whatever() {do something;}

相对于...

var whatever = function(){do something;};

并与史蒂夫哈里森对较早帖子的回复一致......

假设您使用 function 关键字声明所有函数,我认为这将成为一个编程风格的问题。就个人而言,我更喜欢以一种看起来合乎逻辑的方式来构建我的函数,并使代码尽可能地可读。例如,像你一样,我会在顶部放置一个 init 函数,因为它是一切的起点。

...我喜欢以对我有意义的顺序查看功能。

该脚本在测试的几种浏览器(例如,FireFox、Safari、Mobile Safari、Fennec、IE、Chrome、Midori 等)中都能完美运行。

这就是问题所在:我想在使用 Titanium 构建的 iPhone 应用程序中使用脚本,但它的编译器因“在定义之前使用”错误而停止。

我怎样才能解决这个问题?

这可能是一个愚蠢的问题,但也......如果需要按特定顺序调用函数,如何解决被调用函数需要回调到最初调用它的函数的问题?例如...

function buildMenu(){
     Display a list of five menu items, each of which calls a function to build the associated screen.
}

function screen1() {
     Display the screen associated with menu item #1.
}

如果函数需要按顺序声明,则function screen1需要先于function buildMenu. 但是,如果在某些情况下,screen1 无法构建并因此想要重新显示菜单(即调用技术上尚未声明的函数)怎么办?

哦,是的......还有一个问题:是否有网站或程序可以自动重新排序功能而不是要求程序员手动执行?

4

1 回答 1

10

不,EM 的答案不是正确的解决方案。尝试运行这个 JavaScript:

(function () {
   foo(); // right

   var foo = function () {
     console.log("wrong");
   };

   foo(); // wrong

   function foo() {
     console.log("right");
   }

   foo(); // wrong
}());

这是因为解释器将首先读取函数声明,将名称创建foo为打印“正确”的函数,然后读取var语句,并发现已经有名称foo,因此它将跳过创建具有 value 的新变量undefined,如通常会发生。然后它逐行处理代码,其中包括对foo. 函数声明不会被重新处理。也许这在 Titanium 中的行为会有所不同,但在 Firebug 中尝试一下,你会得到我所得到的。

更好的解决方案是:

var screen1, buildMenu;

screen1 = function () { buildMenu(); };
buildMenu = function () { screen1(); };

这也将通过 JSLint,并产生正确的行为。

于 2010-03-05T21:16:55.003 回答