【问题标题】:JSHint with ECMAScript6: method is not defined带有 ECMAScript6 的 JSHint:方法未定义
【发布时间】:2015-07-05 16:46:34
【问题描述】:

我正在使用 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() 应该没问题。但是,如果不将 this 添加到方法调用中,我会收到来自 JSHint 的“'myMethod' is not defined”警告。我的问题是:

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

【问题讨论】:

    标签: javascript ecmascript-6 jshint


    【解决方案1】:

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

    JsHint 就在这里,没有理由关闭该警告。即使这可能是可能的,尽管如此执行您的程序只会使其无法正常工作。

    【讨论】:

      【解决方案2】:

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

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

      如果在没有这个的情况下拨打电话是正确的,有什么办法(任何 .jshintrc 标志)来关闭 JSHint 中的这个警告?

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

      【讨论】:

        【解决方案3】:

        在您提供的代码中,未定义标识符 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's description of class

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

        这就是说使用class 只是旧方法的简写,而不是新模型,因此可能更容易想到如果用ES5 编写当前代码会是什么样子 em>,

        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;
        }());
        

        【讨论】:

          猜你喜欢
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-10
          • 2013-09-07
          • 2014-01-17
          • 2012-02-09
          相关资源
          最近更新 更多