繁体   English   中英

带ECMAScript6的JSHint:方法未定义

[英]JSHint with ECMAScript6: method is not defined

我正在使用ECMAScript6实现客户端应用程序,并使用JSHint进行静态代码分析。 我经常在代码中使用以下模式:

class MyClass {

    constructor() {
        //This is how I would like to call myMethod
        myMethod();

        //This is how I should call myMethod to make JSHint analysis pass
        this.myMethod();
    }

    myMethod(){
        //Implementation
    }
}

我的主要语言是Java,因此我希望只需调用myMethod()即可。 但是,如果不将此方法添加到方法调用中,则会从JSHint收到“未定义'myMethod'的警告”。 我的问题是:

  1. 它是正确的,使在这样的情况下没有这个电话? (例如,在PHP中,您始终需要将$ this->添加到非静态方法调用中)
  2. 如果在没有此方法的情况下进行呼叫是否正确,是否有任何方法(任何.jshintrc标志)可以在JSHint中关闭此警告?

不,这在JavaScript中永远都是正确的。 始终需要在接收方上显式地调用方法以使this工作有效 ,并且需要使用属性访问符号来引用它们,因为方法只是 javascript中属性上的函数 在其他方法的范围内,它们不可用作函数。 属性相同 ,顺便说一句。

JsHint就在这里,没有理由关闭该警告。 即使有可能,尽管执行程序仍然会使程序无法正常工作。

在您提供的代码中,未定义标识符myMethod ,但定义了MyClass实例的继承属性myMethod

如果您将myMethod定义为在其他地方无法使用的闭包下的函数 ,则可以按所需的形式对其进行访问

var MyClass = (function () {
    function myMethod() {
        //Implementation
    }

    class MyClass {
        constructor() {
            myMethod();
        }
    }
    return MyClass;
}());

我没写太多ES6,所以我不确定将function myMethod放入MyClass的定义中是否是SyntaxError

但是请注意, this是引用您的MyClass特定实例所必需的,因此,如果您希望MyMethod对该实例执行操作,则可能需要在某个地方使用它。

function myMethod(obj) {...}
// ...
        myMethod(this);

如果您阅读了MDN的class说明

JavaScript类ECMAScript 6中引入,是JavaScript现有的基于原型的继承的 语法糖 类语法没有JavaScript引入新的面向对象的继承模型。 JS类提供了一种更简单明了的语法来创建对象和处理继承。

这就是说使用class只是实现旧方法的简写,而不是新模型,因此考虑使用ES5编写当前代码看起来会更容易,

var MyClass = (function () {
    function MyClass() {
        this.constructor.apply(this, arguments);
    }
    MyClass.prototype = Object.create(null);
    MyClass.prototype.constructor = function () {
        myMethod(); // referenceError
        this.myMethod(); // works
    };
    MyClass.prototype.myMethod = function () {
        //Implementation
    };
    return MyClass;
}());

在这种情况下拨打电话不带电话是否正确? (例如,在PHP中,您始终需要将$ this->添加到非静态方法调用中)

不它不是。 您始终必须指定方法的接收者。

如果在没有此方法的情况下进行呼叫是否正确,是否有任何方法(任何.jshintrc标志)可以在JSHint中关闭此警告?

JSHint返回正确的“'myMethod'未定义”警告,因为在构造函数的范围内没有名为myMethod的函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM