这是一个糟糕的Javascript练习我在这里做什么?

时间:2011-01-14 14:51:48

标签: javascript jquery memory-management

出于某种原因,我每次都这样做,因为我发现它很干净。我在顶部声明变量以在下面使用它们。即使我只使用它一次,我也这样做。

以下是一个示例(使用jQuery框架):

$("#tbListing").delegate("a.btnEdit", "click", function(e) {
    var storeId = $(this).closest("tr").attr("id").replace("store-", ""),
        storeName = $(this).closest("tr").find("td:eq(1)").html(),
        $currentRow = $(this).closest("tr");

    $currentRow.addClass("highlight");

    $("#dialogStore")
        .data("mode", "edit")
        .data("storeId", storeId)
        .data("storeName", storeName)
        .dialog( "open" );

    e.preventDefault();
});

我也倾向于在PHP中这样做。如果我认为这样做的记忆效率不高,我是对的吗?

编辑:感谢您的所有答案。你们都得到了很好的答案。现在关于代码优化。那现在好多了吗?

            $("#tbListing").delegate("a.btnEdit", "click", function(e) {
                var $currentRow = $(this).closest("tr"),
                    storeId = this.rel, /*storing the storeId in the edit button's rel attribute now*/
                    storeName = $currentRow.find("td:eq(1)").html();

                $currentRow.addClass("highlight");

                $("#dialogStore")
                    .data("info", {
                        "mode" : "edit",
                        "storeId" : storeId,
                        "storeName" : storeName
                    }) /*can anyone confirm that overusing the data isn't very efficient*/
                    .dialog( "open" );


                e.preventDefault();
            });

4 个答案:

答案 0 :(得分:12)

对不起,您是否在询问是否可以申报变量,即使您使用过一次变量也是如此?

绝对!如果用变量正确命名,它会使代码的可读性提高一百万倍。可读性应该是您最关心的问题。如果证明存在问题,那么记忆效率应该只是一个问题。

正如Knuth所说,

  

我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。

如果您要求更多关于在函数开头声明变量而不是第一次使用它们的位置,那么Emmett has it right - Crockford建议在JavaScript中执行此操作以避免与范围相关的混淆。在PHP中是否值得它是一个纯粹主观的问题我会说,但保持你的PHP和JS编码风格相似并没有错。


另一个CS引用(来自Abelson和Sussman的SICP):

  

必须编写程序供人们阅读,并且只能偶然让机器执行。

答案 1 :(得分:6)

这不是一种不好的做法。

  

var语句应该是函数体中的第一个语句。

     
     

JavaScript没有块范围,   所以在块中定义变量可以   迷惑程序员   与其他C家族有经验   语言。定义所有变量   功能的顶部。

http://javascript.crockford.com/code.html

答案 2 :(得分:2)

在顶部声明变量是一件好事。它使代码更具可读性。在您的特定示例中,您可以使用变量替换$(this).closest('tr'),如同注释中所建议的那样,但通常我会在一个地方找到具有描述性变量名称的代码,这些代码都非常易读。

答案 3 :(得分:1)

不,我会说你做的是正确的事。

正如@Caspar所说,您可以先设置$currentRow并在其他两行中使用{而不是$(this).closest("tr")来简化代码。而且可能还有其他一些可以改进的事情。但是,在功能开始时按照你的方式设置变量绝对是一件好事。

特别好,因为你已经在函数内部完成了它,所以它们是局部变量,这意味着它们会在函数结束时被抛弃,因此没有内存使用问题。

如果你把它们设置为全局变量,它可能更多的是一个问题,虽然说实话,因为你只是设置指向现有对象的指针,它不会使用大量的甚至那时的内存(虽然它会污染全局命名空间,但这并不好)