带有ECMAScript6的JSHint:方法未定义

时间:2015-07-05 16:46:34

标签: javascript ecmascript-6 jshint

我使用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()即可。但是,如果没有将添加到方法调用中,我就可以获得" myMethod'没有定义"来自JSHint的警告。我的问题是:

  1. 在这种情况下,在没有的情况下拨打电话是否正确? (例如在PHP中,您总是需要将 $ this-> 添加到非静态方法调用中)
  2. 如果在没有此的情况下拨打是正确的,那么在JSHint中是否有任何方式(任何 .jshintrc 标志)关闭此警告?

3 个答案:

答案 0 :(得分:5)

不,这在JavaScript中从来都不正确。方法总是需要在接收器上明确地调用make this work,并且需要使用属性访问表示法来引用它们,因为方法只是javascript中属性的函数。它们不能作为其他方法范围内的函数使用。 It's the same for properties,顺便说一句。

JsHint就在这里,没有理由拒绝警告。即使这可能,尽管如此,执行你的程序只会使它无效。

答案 1 :(得分:1)

在您提供的代码中,未定义标识符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); 对该实例执行操作,则可能需要在某处使用它。

class

如果您阅读MDN's description of class

   ECMAScript 6 中引入了

JavaScript类 JavaScript 现有的原型语法糖 - 基于继承。类语法将新的面向对象的继承模型引入 JavaScript 。 JS类提供了一个更简单,更清晰的语法来创建对象和处理继承。

这就是说使用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; }()); 只是旧方法的简写,而不是新模型,因此如果用 ES5编写,可能更容易想到当前代码会是什么样子

mark {
    color: #CCC;
    background: #333;
    padding: 5px;
    margin: 5px;
}
mark:nth-child(even) {
    background: #000;
}

答案 2 :(得分:1)

  

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

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

  

如果在没有这个的情况下拨打电话是正确的,那就有任何办法(任何方式)   .jshintrc flag)在JSHint中关闭此警告?

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