Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是一个糟糕的Javascript实践吗;我在这里干什么?_Javascript_Jquery_Memory Management - Fatal编程技术网

这是一个糟糕的Javascript实践吗;我在这里干什么?

这是一个糟糕的Javascript实践吗;我在这里干什么?,javascript,jquery,memory-management,Javascript,Jquery,Memory Management,出于某种原因,我每次都这么做,因为我觉得它很干净。我在上面声明变量,以便在下面使用它们。即使我只使用一次,我也会这样做 下面是一个示例(使用框架): 我也倾向于在PHP中这样做。如果我认为这样做的内存效率不是很高,我是对的吗 编辑:感谢您提供的所有答案。你们都给出了很好的答案。关于代码优化。现在好点了吗 $("#tbListing").delegate("a.btnEdit", "click", function(e) { var $cur

出于某种原因,我每次都这么做,因为我觉得它很干净。我在上面声明变量,以便在下面使用它们。即使我只使用一次,我也会这样做

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

我也倾向于在
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();
            });

对不起,您是在问即使只使用了一次变量也可以声明变量吗

绝对是!如果使用变量正确命名,代码的可读性将提高一百万倍。可读性应该是您最关心的问题。只有在证明存在问题时,内存效率才应该受到关注

正如Knuth所说

我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源

如果您想了解更多关于在函数开头声明变量的信息,而不是在第一次使用变量的地方,那么-Crockford建议您在JavaScript中这样做,以避免与范围相关的混淆。我想说的是,在PHP中是否值得这样做纯粹是一个主观问题,但保持PHP和JS编码风格相似并没有什么错


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

程序必须是为人们阅读而编写的,而且只是为机器执行而编写的

这是个不错的练习

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


JavaScript没有块作用域, 因此,在块中定义变量可以 迷惑那些 有其他C族工作经验 语言。同时定义所有变量 函数的顶部


在顶部声明变量是一件好事。它使代码更具可读性。在您的特定示例中,您可以使用变量替换$(this).nestest('tr'),正如int-eh注释中所建议的那样,但一般来说,我发现在一个地方使用描述性变量名的代码非常可读。

不,我认为您做的完全正确

正如@Caspar所说,您可以先设置
$currentRow
,然后使用它来代替另两行中的
$(this).closest(“tr”)
,从而简化代码。也许还有其他一些事情你可以改进。但是,在函数开始时按您的方式设置变量绝对是一件好事

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


如果您将它们设置为全局变量,这可能会是一个更大的问题,尽管老实说,即使在那时,由于您只是设置指向现有对象的指针,因此即使在那时,它也不会占用大量内存(尽管这会污染全局名称空间,这是不好的)

重复$(this)。可以避免最近的(“tr”);)我不想看到这样的评论:嘿,你做错了,因为你在“id”属性中存储了信息,或者你应该使用一个对象在数据中只存储一次信息。我只想知道这样做对内存/浏览器允许的内存有多坏。@Caspar,是的,我知道。我可以简单地将
$(this.closest(“tr”)
存储在一个变量中,这样jQuery就不必每次都运行DOM了:佩尔。。。在70年代,我可以在顶部声明
$currentRow
,在下面使用它。97%。现在它超过了99.97%,所以你说你应该只担心发生时的内存效率(因为内存效率从本质上来说总是有问题的),这是糟糕的未来证明。“可读性肯定是仅次于功能的吗?”本豪德尔说,只有在影响功能的极少数情况下,你才应该担心内存效率。不过,我认为,OP是在询问一般的良好做法。寻找不存在的优化和通常尝试编写高效、紧凑的代码是有区别的。我不认为上面的引语是一种编写草率代码的许可证,只在它引起问题时才担心它。这样你会遇到更多的问题。@benhowdle:可读性是第一位的,也是最重要的。你无法优化你无法阅读的内容并非所有人都同意Crockford所说的一切,尤其是在这一点上。我当然不知道。@Tim那么你建议在哪里定义变量呢?嗯?在给出的示例代码中,
var
语句是函数体的第一行。@Spudley他说的是“不,这不是一个坏习惯”,我想。@Emmett:我更喜欢在使用变量的地方声明变量,尽管我不反对人们在函数顶部声明它们(我自己也有过这样做的阶段)。我不认为它需要Crockford“这是最佳实践”式的指令。谢谢,您已经指定它们在执行后被丢弃,因为它们是局部变量。我是这么想的,但我不确定。我想知道你还有哪些地方可以改进。我编辑了我的问题,包括(我相信)优化版。介意看一下吗?
            $("#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();
            });