Javascript 如何使用strict模式并在JSlint中不出错

Javascript 如何使用strict模式并在JSlint中不出错,javascript,ecmascript-6,scope,jshint,Javascript,Ecmascript 6,Scope,Jshint,查看关于JSlint的所有信息(例如or),讨论的内容如下 始终使用严格模式,因为它会捕获更多错误。你所要做的就是把“严格使用”放在代码的顶端。就这样!再简单不过了。。。除非JSlint抱怨并告诉您将其放入函数范围,否则您必须将所有代码放入一个巨大的函数中 我有数百个用javascript编写的函数,至少会在加载时调用回调函数,因此我试图思考如何将所有函数放在另一个函数中,但仍然确保元素仍然可以穿透外部函数,并使用内部函数调用我的函数范围 有人能告诉我如何为类似的东西实现严格模式吗 /* Beg

查看关于JSlint的所有信息(例如or),讨论的内容如下

始终使用严格模式,因为它会捕获更多错误。你所要做的就是把“严格使用”放在代码的顶端。就这样!再简单不过了。。。除非JSlint抱怨并告诉您将其放入函数范围,否则您必须将所有代码放入一个巨大的函数中

我有数百个用javascript编写的函数,
至少会在加载时调用回调函数,因此我试图思考如何将所有函数放在另一个函数中,但仍然确保
元素仍然可以穿透外部函数,并使用内部函数调用我的函数范围

有人能告诉我如何为类似的东西实现严格模式吗

/* Begin Pseudocode */
include <a>;             /* Include some external library */
external var external_a; /* Indicate that it is defined externally */
var global_a;            /* Create global scope variable */

function xyz (p_1, p_2); /* Declare global scope function */

function xyz (p_1, p_2){ /* Define function */
    return p_1 * external_a + p_2 * global_a; /* Example calculation */
}
函数foo(){
“严格使用”;/*方法1:将每个函数放入内部*/
/*极其乏味和丑陋*/
$('#示例').text('Hello'+bar());
}
功能条(){
“严格使用”;/*方法1:将每个函数放入内部*/
/*极其乏味和丑陋*/
返回“美丽”;
}
函数fooBar(){
“使用严格”;/*方法2:在外部函数顶部放置一次*/
/*但是现在如何调用这个函数呢*/
函数foo(){
“严格使用”;
$('#示例').text('Hello'+bar());
}
功能条(){
“严格使用”;
返回“美丽”;
}
}


在现代JavaScript中,应尽可能避免内联处理程序,因为它们需要全局污染,需要使用一些参数进行难看的引号转义,并且具有荒谬的范围链规则。因此,请尝试删除内联处理程序,并将JavaScript放入IIFE,这可以变得非常严格:

(()=>{
“严格使用”;
函数foo(){
$('#示例').text('Hello'+bar());
}
功能条(){
返回“美丽”;
}
addEventListener('DOMContentLoaded',foo);
})();


虽然CertainPerformance的答案在这里是最好的,但我仍然想在我的意思的上下文中回答我自己的问题,也许不是我确切的措辞

一些编程语言似乎不太关心范围(我在看Python),但是大多数成熟的C++(C++)是最强的,提供了某种形式的范围,比如

/* Begin Pseudocode */
include <a>;             /* Include some external library */
external var external_a; /* Indicate that it is defined externally */
var global_a;            /* Create global scope variable */

function xyz (p_1, p_2); /* Declare global scope function */

function xyz (p_1, p_2){ /* Define function */
    return p_1 * external_a + p_2 * global_a; /* Example calculation */
}
必须以这种奇怪的方式重构代码库通常是一种糟糕编程语言的危险信号,在这种语言中,你基本上是在修改语法以获得你想要的功能,在这个过程中把自己变成一个准编译器,但这种方法还有另一个问题:它会导致糟糕的编程实践,比如定义变量但从未使用过。如果您通过JSHint运行上述javascript代码,它会抱怨
xyz已定义,但从未使用过
。从技术上讲,这是正确的,但这是所有API的全部本质:编写一次,以后使用……也许。然后,这就导致了一场彻底的兔子洞探险,试图抑制一些JSHint错误(如定义了但从未使用的
xyz
),而不抑制其他错误(如定义了但从未使用的
a
)。也许有一种方法可以配置JSHint来识别这种特殊情况,但我的观点是,应该有一种干净的方法来实现这种结果,而JSHint应该只针对这种方法进行配置

现在Javascript在技术上确实有一个导出功能,可以像这样使用,但对我来说,一种强大的语言应该基于一个文件创建一个模块,而不是基于该文件的一个经过大量修改的版本,而且该模块应该被导入而不是导出

var module_a = (() =>{
    var global_a; /* function scope */
    let xyz;      /* Declare function */

    xyz = function  (p_1, p_2){ /* Define function */
        return p_1 * p_2; /* Example calculation */
    };

    return {
        xyz: xyz
    };
}(external_a); /* passed externally */

export module_a;
我想我想说的是,我觉得我会从这个社区得到很大的回击,Javascript希望成为一种具有高级功能的OO语言,但通过黑客攻击它来做一件事会暴露出一个弱点,然后必须再次被黑客攻击。Javascript在线社区未能解决这些缺点,导致类似以下的在线教程脱离现实()

[A] 模块[A]是以模块化方式编写的自包含且可重用的JavaScript代码块。在ES6之前,JavaScript没有定义任何用于处理模块的语言构造。因此,编写模块化JavaScript需要使用一些编码约定

现在,这是一个更诚实的教程,但编码惯例似乎有点淡化和中性为我的口味。本质上,作者所说的是,没有干净的方法来做,所以不幸的是,你必须破解它


所以,对于我最初的问题,我冗长的回答是:你必须把你的整个代码库,都是全局范围和易于使用的API,放在一个匿名函数中,然后坚持一个
“use strict”在顶部,这样JSHint就可以工作了,然后无论您需要公开哪些API端点,您都会返回一个巨大的对象,然后当JSHint抱怨变量被声明但没有使用时,您会在那里粘贴一条
/*JSHint行:忽略*/
注释,然后在该注释不起作用时删除该注释(很可能已弃用)因此,在未使用的变量部分周围使用(
/*jshint unused:false*/
..
/*jshint unused:true*/
)来切换该选项然后在页面末尾导出返回的对象,并将其导入其他地方并使用。

如果我有另一个文件/库/iLife想要使用它,该怎么办?对我来说,这种方法似乎不是一种可伸缩的方法,除非Javascript的黄金法则是将所有内容放在一个大文本文件中。万一有人不知道iLife意味着什么:是的h、 超过150行,iLife可能会变得笨拙。要成为专业人士,请使用模块绑定器l