no-shadow (Rules) – Eslint 中文开发手册

[
  •   Eslint 中文开发手册

    no-shadow (Rules) - Eslint 中文开发手册

    阴影是局部变量与其包含范围内的变量共享相同名称的过程。例如:

    var a = 3;
    function b() {
        var a = 10;
    }

    在这种情况下,a内部的变量b()会映射a全局范围中的变量。这会在阅读代码时造成混淆,并且无法访问全局变量。

    规则细节

    该规则旨在消除阴影变量声明。

    此规则的错误代码示例:

    /*eslint no-shadow: "error"*/
    /*eslint-env es6*/
    
    var a = 3;
    function b() {
        var a = 10;
    }
    
    var b = function () {
        var a = 10;
    }
    
    function b(a) {
        a = 10;
    }
    b(a);
    
    if (true) {
        let a = 5;
    }

    选项

    这条规则从一个选项,对象,具有属性"builtinGlobals","hoist"和"allow"。

    {
        "no-shadow": ["error", { "builtinGlobals": false, "hoist": "functions", "allow": [] }]
    }

    builtinGlobals

    该builtinGlobals选项是false默认的。如果它是true:,该规则防止在内置全局变量的阴影Object,Array,Number,等等。

    选项的错误代码示例{ "builtinGlobals": true }:

    /*eslint no-shadow: ["error", { "builtinGlobals": true }]*/
    
    function foo() {
        var Object = 0;
    }

    hoist

    该hoist选项有三个设置:

    functions (默认情况下) - 在定义外部函数之前报告遮蔽。all - 在定义外部变量/函数之前报告所有阴影。never - 在定义外部变量/函数之前从不报告阴影。

    hoist: functions

    不正确的代码为默认{ "hoist": "functions" }选项的示例:

    /*eslint no-shadow: ["error", { "hoist": "functions" }]*/
    /*eslint-env es6*/
    
    if (true) {
        let b = 6;
    }
    
    function b() {}

    虽然let b在if声明中是在外部作用域中的函数声明之前,但它是不正确的。

    默认选项的正确代码示例{ "hoist": "functions" }:

    /*eslint no-shadow: ["error", { "hoist": "functions" }]*/
    /*eslint-env es6*/
    
    if (true) {
        let a = 3;
    }
    
    let a = 5;

    因为let a在声明中在外部范围中if的变量声明之前,所以是正确的。

    hoist: all

    选项的错误代码示例{ "hoist": "all" }:

    /*eslint no-shadow: ["error", { "hoist": "all" }]*/
    /*eslint-env es6*/
    
    if (true) {
        let a = 3;
        let b = 6;
    }
    
    let a = 5;
    function b() {}

    hoist: never

    选项的正确代码示例{ "hoist": "never" }:

    /*eslint no-shadow: ["error", { "hoist": "never" }]*/
    /*eslint-env es6*/
    
    if (true) {
        let a = 3;
        let b = 6;
    }
    
    let a = 5;
    function b() {}

    因为let a并且let b在if声明中是在外部范围的声明之前,所以它们是正确的。

    allow

    该allow选项是允许进行遮蔽的标识符名称的数组。例如"resolve","reject","done","cb"。

    选项的正确代码示例{ "allow": ["done"] }:

    /*eslint no-shadow: ["error", { "allow": ["done"] }]*/
    /*eslint-env es6*/
    
    import async from 'async';
    
    function foo(done) {
      async.map([1, 2], function (e, done) {
        done(null, e * 2)
      }, done);
    }
    
    foo(function (err, result) {
      console.log({ err, result });
    });

    Further Reading

    Variable ShadowingRelated Rulesno-shadow-restricted-names

    版本

    该规则在 ESLint 0.0.9 中引入。

    资源

    Rule sourceDocumentation source

  •   Eslint 中文开发手册
    ]
    转载请保留页面地址:https://www.breakyizhan.com/javascript/34434.html

    posted on 2020-07-05 11:24  MrAit  阅读(736)  评论(0编辑  收藏  举报

    导航