代码之家  ›  专栏  ›  技术社区  ›  Alan M.

与JS“先用后定”和钛显影剂抗衡

  •  10
  • Alan M.  · 技术社区  · 16 年前

    function whatever() {do something;}
    

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

    而且符合 Steve Harrison's reply 转到以前的帖子。。。

    假设你申报了所有 带有function关键字I的函数 问题。就我个人而言,我更喜欢 似乎合乎逻辑,使代码 尽可能可读。例如, 和你一样,我会在 在上面,因为那里是一切 从…开始。

    该脚本在测试过的几种浏览器(如FireFox、Safari、Mobile Safari、Fennec、IE、Chrome、Midori等)中运行良好。

    我怎么才能避开这个?

    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无法构建,因此希望重新显示菜单(即调用技术上尚未声明的函数),该怎么办?

    哦,是的。。。还有一个问题:是否有网站或程序自动重新排序的功能,而不是要求程序员手动做呢?

    1 回复  |  直到 9 年前
        1
  •  10
  •   bcherry    16 年前

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

    这是因为解释器将首先读取函数声明,创建名称 foo var 因此,它将跳过使用 undefined ,就像平常一样。然后它逐行处理代码,其中包括对 . 函数声明不会被重新处理。也许这在钛合金中会有不同的表现,但在Firebug中试试,你会得到我得到的。

    更好的解决方案是:

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

    这也将传递JSLint,并产生正确的行为。