Javascript “与JS抗争”;在定义之前使用;钛显影剂

Javascript “与JS抗争”;在定义之前使用;钛显影剂,javascript,jslint,titanium,Javascript,Jslint,Titanium,我有一个冗长的JavaScript文件,除了“在定义之前使用”错误之外,它通过了JSLint 我使用了普通函数声明,如 function whatever() {do something;} 相对于 var whatever = function(){do something;}; 与之前的帖子一致 假设你申报了所有 带有function关键字I的函数 你认为它会成为一种编程风格吗 问题。就我个人而言,我更喜欢 以一种 似乎合乎逻辑,并使代码 尽可能可读。例如 和你一样,我会在 顶部,因为它

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

我使用了普通函数声明,如

function whatever() {do something;}
相对于

var whatever = function(){do something;};
与之前的帖子一致

假设你申报了所有 带有function关键字I的函数 你认为它会成为一种编程风格吗 问题。就我个人而言,我更喜欢 以一种 似乎合乎逻辑,并使代码 尽可能可读。例如 和你一样,我会在 顶部,因为它是所有东西的所在 从…开始

。。。我喜欢以对我有意义的顺序来看待函数

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

问题是:我想在用Tianium构建的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.
}
如果需要按顺序声明函数,
函数屏幕1
需要位于
函数构建菜单
之前。但是,如果在某些条件下,screen1无法构建,因此希望重新显示菜单(即调用技术上尚未声明的函数),该怎么办


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

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

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

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

   foo(); // wrong

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

   foo(); // wrong
}());
这是因为解释器将首先读取函数声明,创建名称
foo
作为一个打印“right”的函数,然后读取
var
语句,并发现已经有一个名称
foo
,因此它将跳过创建一个值为
未定义
的新变量,就像通常发生的那样。然后逐行处理代码,其中包括对
foo
的赋值。函数声明不会重新处理。也许这在钛合金中会有不同的表现,但在Firebug中尝试一下,你会得到我得到的

更好的解决方案是:

var screen1, buildMenu;

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

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

谢谢。我没有时间检查之前的解决方案,所以我要试一试。再次感谢,说得好。我并没有真正测试我的解决方案。我只是在jslint中运行了它。在jslint和Tianium中都运行得非常好。再次感谢。B.顺便说一句:对于任何需要对现有脚本进行此更改的人,正如我所做的那样,创建函数全局变量列表的一个简单快捷方式是通过JSLint运行脚本,并从结果的底部复制全局列表。它不是100%准确,但在我的情况下,大约有100个函数,我只需要做六次调整。