gpt4 book ai didi

javascript - 证明克罗克福德的主张

转载 作者:行者123 更新时间:2023-12-03 03:06:40 25 4
gpt4 key购买 nike

我已经阅读了Crockford的JavaScript: The Good Parts并使用了他的验证器JSLint。有时我不知道他的建议背后的理由。以下是我想证实的示例列表。

  • 如果您不包括"use strict";,为什么JSLint会发出错误信号? [请参阅this SO thread。]
  • 为什么在函数中使用单个var进行变量声明? [请参阅this SO thread。]
  • 为什么我们需要在function中的()function ()之间放置一个空格?
  • 为什么我们不能使用continue
  • ++--有什么问题?
  • 为什么我们不能使用逗号运算符,(在for语句的初始化和增量部分中除外)? [请参阅this blog post。]
  • 为什么每个语句都以;结尾? [请参阅this blog post。]
  • 最佳答案

    JSLint的许多行为在JSLint instructions page上进行了解释。从现在开始,我将其称为JIP。

    JIP未解释的许多行为由Crockford的Code Conventions for the JavaScript Programming Language解释。从现在开始,我将其称为CCJPL。

    进入列表:

    1)如果您不包括"use strict";,为什么JSLint会发出错误信号?

    因为严格模式强制执行许多良好实践; JSLint也是关于强制执行良好实践的,所以这自然就是它的行为。查看"use strict"启用了哪些功能有助于弄清问题。我只是进入this blog post by Resig列表,因此在此应有功劳。我没有评论它所做的所有事情,因为我不确定Crockford对于每个功能的确切理由。

  • 在分配值之前,必须先使用var声明变量:这将阻止隐式全局变量的出现。全局变量are considered by Crockford是邪恶的,这有助于消除未明确设置的全局变量。
  • 根据JIP,erock有几个限制,Crockford认为这是邪恶的。
  • 禁用with语句。这是considered by Crockford to be harmful

  • 我只跳过了严格模式的两个功能: delete语句的行为被修改和覆盖 arguments变量。我不知道Crockford是同意还是不同意这两件事,但是鉴于他帮助创建了ECMAScript 5标准,所以我倾向于同意。

    2) 为什么在函数中使用单个var进行变量声明?

    首先,任何未经 var声明而定义的变量都是隐式全局的,根据 JIP的说法,这可以“掩盖拼写错误的名称和其他问题”。因此,这就是需要 var的原因。

    至于需要一个 var,JavaScript引擎会自动将所有变量声明 are hoisted置于其作用域的顶部,所以我唯一的猜测是Crockford希望开发人员敏锐地意识到这一行为。除此之外,这可能是样式问题。在以下两个代码段之间,您更喜欢哪个?
    var a, b, c;

    或者
    var a; var b; var c;

    我的猜测是Crockford认为那里的多个 var很丑。我同意他的观点。

    具有讽刺意味的是,根据 CCJPL,他实际上建议将所有变量声明与相关注释放在不同的行上。 JSLint在这方面不同意他!

    3) 为什么我们需要在function中的()function ()之间放置一个空格?

    这仅适用于匿名函数。根据 CCJPL,这是因为:

    If a function literal is anonymous, there should be one space between the word function and the ( (left parenthesis). If the space is omited, then it can appear that the function's name is function, which is an incorrect reading.



    当我学习JavaScript的时候,我虔诚地开始遵循Crockford的约定...但是我的逻辑部分是说,如果您有命名函数 function的代码,那么无论如何都可能非常需要进行重做。 (更不用说在JavaScript中,它是 SyntaxError,因为 function是关键字。)

    4) 为什么我们不能使用continue

    引用 CCJPL:

    It tends to obscure the control flow of the function.



    这不是一个详尽的答案,但是我已经在互联网上看到了将其与 goto进行比较的争论。想拿就拿吧。

    5) ++--有什么问题?

    正如 JIP所说:

    The ++ (increment) and -- (decrement) operators have been known to contribute to bad code by encouraging excessive trickiness. They are second only to faulty architecture in enabling to viruses and other security menaces. Also, preincrement/postincrement confusion can produce off-by-one errors that are extremely difficult to diagnose.



    6) 为什么我们不能使用逗号运算符,(除了for语句的初始化和增量部分之外)?

    JIP的另一个详尽的解释:

    The comma operator can lead to excessively tricky expressions. It can also mask some programming errors.



    这实在令人遗憾,因为正如您链接的博客文章所显示的那样,逗号运算符确实可以在某些情况下提高代码的清晰度。

    您会在Crockford的许多约定中注意到一个共同的基础主题:易于理解的代码。这只是另一个例子。许多约定都围绕拒绝访问“棘手的”表达式。

    但是我认为我用来描述其中一些表达的真实词是“简洁”-本身不一定是一件坏事,但如果使用不当,可能会很邪恶。克罗克福德的约定有时试图通过删除这些表达式使用的一些工具来粉碎错误使用的简洁性,即使它们在某些情况下具有合法的用途。

    7) 为什么每个语句都以;结尾?

    再次引用 JIP:

    JavaScript uses a C-like syntax which requires the use of semicolons to delimit certain statements. JavaScript attempts to make those semicolons optional with a semicolon insertion mechanism. This is dangerous because it can mask errors.

    Like C, JavaScript has ++ and -- and ( operators which can be prefixes or suffixes. The disambiguation is done by the semicolon.



    通常,我发现Crockford的解释中的“可以掩盖错误”部分相当广泛和模糊,但是分号插入确实是我可以全心全意同意的领域。在每个语句后使用显式分号比缩小分号插入的危险范围要容易得多。

    这是 JavaScript Syntax的Wikipedia页面上分号插入错误的经典示例:
    return
    a + b;

    // Returns undefined. Treated as:
    // return;
    // a + b;

    而且,如果您使用对象文字,例如 this blog post中的代码(一种相当普遍的花括号样式),那么它也可能使您困惑:
    function shoeFactory() {
    return // <--- semicolon inserted here
    {
    shoeSize: 48
    };
    }

    var shoe = shoeFactory();
    console.log(shoe); // undefined

    上述Wikipedia文章中的另一个示例:
    a = b + c
    (d + e).foo()

    // Treated as:
    // a = b + c(d + e).foo();

    我也从来没有真正被添加显式分号所困扰。在编写几乎所有代码时,它们都很自然地来到我这里。实际上,即使没有必要,我也会经常在分号中加入分号。

    在这种情况下,我非常同意克罗克福德。我认为一个有关分号插入的调试 session 可能会使大多数人相信,将它们放在代码中会更容易。

    关于javascript - 证明克罗克福德的主张,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6950636/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com