簡體   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