0

我已经开始使用 Sencha Touch / ExtJS JavaScript 框架,并且注意到嵌套匿名函数的广泛使用。例如,这是启动应用程序的常用方法:

Ext.setup({
    blah: blah,
    onReady: function() { 
        my
        fairly
        long
        startup
        code }
});

我已经有一段时间没有做 JavaScript 编程了。对我来说,像这样定义一个嵌套匿名函数——在函数调用内部——并不像下面这样容易阅读:

Ext.namespace('myvars');

myvars.onReadyFcn = function() { 
     my
     fairly
     long
     startup
     code
};

Ext.setup({
    blah: blah,
    onReady: myvars.onReadyFcn
});

我知道在某些情况下使用匿名函数有一些真正的好处(例如,也许它是一次性代码,也许您不想向全局命名空间添加另一个函数等)。也就是说,如果您发现使用后一种(可能更冗长)方法更容易阅读,在技术上是否有任何错误/有害?

谢谢!

4

4 回答 4

4

我一直都在使用这两种方式,而没有过多考虑哪种方式更好。而且我相信,就性能而言,如果您担心移动设备的下载时间或解析时间,那么您最终会使用一些JS Minifier(或者可能是 Google 的Closure Compiler)。

无论如何,我确实有一个标准似乎有助于我决定该函数是否应该是匿名的:

如果我有一个非常好的函数名称,那么它不应该是匿名的

我的意思是,如果您的函数将被命名onSetupReady,那么该函数并没有解释它的作用,而是它的名称定义了它应该在哪里使用(通常只有一个地方会调用该函数)。因此,如果是这种情况,那么您可以选择使函数匿名或不匿名。我通常选择匿名。

但是,如果你的函数只做一件事,而那件事并不是很明显,并且你很想在函数的第一行(或其他)放一行注释来解释它的作用。那么我不会那样做,我会为这个函数选择一个好名字。我更强调这个规则,当触发这个函数的事件对于那个函数并不明显时。例子:

匿名好的

Ext.Window({
    listernes: { 
        beforeclose: function() {  // This function has only one purpose and
            Ext.Msg.show({         // can be named, but I think it's OK. Because
                title:'Close?',    // it is really easy to see what it does.
                msg: 'Are you sure?',
                fn: function(btn) {
                    if (btn === 'cancel') {
                        return false;
                    }
                },
                animEl: 'elId',
                icon: Ext.MessageBox.QUESTION
            });
        }
    }
}).show();

匿名不推荐

var insertExtraToolbar = function() {
    var containerNbar = theGrid.getBottomToolbar().getEl().parent().dom;
    theGrid.elements += ',nbar';
    theGrid.createElement('nbar', containerNbar);
};
theGrid.on('render', insertExtraToolbar);
于 2010-09-03T18:31:59.040 回答
3

我不认为使用单独的函数有什么问题,这取决于目的。对于设置函数或 onReady 函数,我会喜欢匿名函数,对于像 1 或 2 行这样非常小的代码的回调函数,我将使用匿名函数。对于回调,我经常喜欢使用单独的函数,但是,我发现它更易于阅读,尤其是大多数框架都提供了一种在制作 XHR 时将参数传递给回调的简单方法。

但是,嵌套匿名函数给您的一个优势是变量的闭包,如果您将函数分开,有时您可能最终需要将其作为参数传递。

这是一个非常难以回答的问题,因为这将是一个风格、性能、目的的问题,这取决于你编写代码的目的是什么。

于 2010-09-03T18:02:57.160 回答
2

当我第一次开始遇到嵌套匿名函数时,我曾经有过和你一样的感觉。

现在我已经习惯了它们,实际上我发现嵌套的匿名函数更容易阅读,只要它们只在一个地方使用。当以这种方式编写代码时,我感兴趣的所有代码都在一个位置,我几乎不需要在文件中跳转来找出代码试图做什么。

但请记住,我的意见仅适用于代码仅用于一个位置的情况。如果您继续在多个地方重复相同的匿名函数……我仍然喜欢像您的第二个示例一样将其分解。

于 2010-09-03T14:38:04.030 回答
1

在某种程度上,您可能已经回答了自己的问题。OnReady 函数只运行一次。为了可维护性,最好将代码分离出来,以便在代码中有一个布局部分、一个事件部分和一个业务逻辑部分。

可能要考虑的一件事是,Sencha Touch 是面向移动设备的,这些设备有时可能有有限的资源供您使用。考虑到这一点,可能有必要构建代码以使其尽可能小且高效。您提出的代码片段可能忽略了移动平台必须处理的那些限制。

于 2010-09-03T14:44:36.677 回答