Javascript Crockford索赔的正当性

Javascript Crockford索赔的正当性,javascript,jslint,Javascript,Jslint,我读过Crockford的书,用过他的验证器。我有时会疑惑他的建议背后的理由。下面是我想要证实的例子列表 如果没有包含“use strict”,为什么JSLint会发出错误信号?[见] 为什么函数中的变量声明应该使用单个var?[见] 为什么我们需要在function()中的函数和()之间加一个空格 为什么我们不能使用继续 ++和-有什么问题 为什么不能使用逗号运算符,(除了for语句的初始化和递增部分)?[见] 为什么每个语句都应该以结尾?[见] 你说得对,克罗克福德并不经常证实他的做法 例

我读过Crockford的书,用过他的验证器。我有时会疑惑他的建议背后的理由。下面是我想要证实的例子列表


  • 如果没有包含
    “use strict”,为什么JSLint会发出错误信号?[见]

  • 为什么函数中的变量声明应该使用单个
    var
    ?[见]

  • 为什么我们需要在
    function()
    中的
    函数和
    ()
    之间加一个空格

  • 为什么我们不能使用
    继续

  • ++
    -
    有什么问题

  • 为什么不能使用逗号运算符
    (除了
    for
    语句的初始化和递增部分)?[见]

  • 为什么每个语句都应该以
    结尾?[见]


  • 你说得对,克罗克福德并不经常证实他的做法

    例如,在我看来,定义
    var
    s到范围顶部以外的某个位置是可以的,只要您意识到。无论如何,Javascript都会将它们提升到作用域的顶部。此外,我认为它实际上是有益的,因为您可以轻松地选择变量的初始值,您所需要做的就是查找
    var

    我还认为,如果您知道如何使用开关盒故障,则它们非常有益。特别是对于编写类似于非常复杂的状态机的东西

    if
    for
    后面有一条语句,不带大括号也可以。几十年来,人们一直以这种方式编写C

    如果您知道什么构成javascript语句的结尾,分号也不是必需的。分号的插入不是随机的,它不是不可破解的,这与流行的观点相反

    Crockford以破坏regex而闻名,这太可怕了。非常强大(快速)的词汇量可以使用regex作为词汇量/规则/语法/whathaveyou编写

    大部分情况下,克罗克福德知道他在说什么,但不要把他的个人风格当作福音。我认为这是毫无根据的。我见过的一些最好的javascript程序员在代码方面直接反对Crockford的风格


    编辑:我不明白为什么这个问题被关闭了。它可以被客观地讨论,并且值得一谈。

    JSLint的许多行为都在网站上进行了解释。从现在起,我将把它称为JIP

    许多没有被JIP解释的行为是由Crockford解释的。从现在起,我将称之为CCJPL

    要查看列表,请执行以下操作:

    1) 如果没有包含
    “use strict”,为什么JSLint会发出错误信号

    因为严格的模式强制执行许多良好的实践;JSLint也是关于实施良好实践的,所以这自然是它的行为。查看
    “使用严格的”
    可以帮助澄清问题。我只是简单地往下看,所以这里给出了应有的信用。我不是在评论它所做的每一件事,因为我不确定Crockford对每一个特性的确切推理

  • 在赋值之前,必须使用
    var
    声明变量:这将阻止隐式全局变量的出现。全局变量是邪恶的,这有助于消除未显式设置的全局变量
  • 它有几个限制评估,克罗克福德认为,根据法律,评估是邪恶的
  • 它使用
  • 语句禁用
    。这是
    我只跳过了strict模式的两个特性:修改
    delete
    语句的行为和覆盖
    参数
    变量。我不知道Crockford是否同意这两件事,但考虑到他帮助创建了ECMAScript 5标准,我倾向于同意

    2) 为什么函数中的变量声明应该使用单个
    var

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

    至于需要一个
    var
    ,JavaScript引擎会自动将所有变量声明放到其作用域的顶部,因此我唯一的猜测是Crockford希望开发人员能够敏锐地意识到这种行为。除此之外,这可能是一个风格问题。在以下两段代码中,您更喜欢哪一段:

    var a, b, c;
    

    我猜Crockford认为多重
    var
    s在那里很难看。在那一点上我同意他的意见

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

    3) 为什么我们需要在
    函数()中的
    函数
    ()
    之间留出一个空格?

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

    如果函数文本是匿名的,则在 单词function和((左括号)。如果空格为 省略,则函数的名称可能是function,这 这是一个错误的读数

    当我在学习JavaScript的时候,我开始虔诚地遵循Crockford的约定……但是我的逻辑部分说,如果你有命名函数的代码,
    函数
    ,那么无论如何,它可能非常需要重新编写。(更不用说在JavaScript中,它是一个
    语法错误
    ,因为
    函数
    是一个关键字。)

    4) 为什么我们不能使用
    继续

    引述:

    它往往会模糊函数的控制流

    不完全是一个详尽的答案
    var a; var b; var c;
    
    return
    a + b;
    
    // Returns undefined. Treated as:
    //   return;
    //   a + b;
    
    function shoeFactory() {
        return // <--- semicolon inserted here
        {
            shoeSize: 48
        };
    }
    
    var shoe = shoeFactory();
    console.log(shoe); // undefined
    
    a = b + c
    (d + e).foo()
    
    // Treated as:
    //   a = b + c(d + e).foo();