1

test1がコンパイルに失敗する理由を誰かが知っていますか?

class Y { public myMethod: any; };
class QQ { public test(name, fun: () => any) { } }

var qq = new QQ();
qq.test("Run test1", () => {

        var outer = 10;

        Y.prototype.myMethod = () => {

          // Error: The name 'outer' does not exist in the current scope
            outer = 11;
        }
});

しかし、次のように機能します。

   qq.test("Run test2", () => {

            var outer = 10;
            var fun = ()=> { outer = 11; };

            Y.prototype.myMethod = fun;
    });

必要なコードのJavaScriptバージョンは次のようになります。

qq.test("Run test1", function () {
    var outer = 10;

    Y.prototype.myMethod = function () {
        outer = 11;
    };
});

外部関数は、そのクロージャ内で変数「外部」を宣言します。これは、内部関数から自然に見えるはずです。

4

2 に答える 2

1

重要なポイントだけに短縮:

これはあなたが期待していると思うJavaScriptです。

var Y = (function () {
    function Y() { }
    Y.prototype.myMethod = function () {
    };
    return Y;
})();
var QQ = (function () {
    function QQ() { }
    QQ.prototype.test = function (name, fun) {
        fun();
    };
    return QQ;
})();
var qq = new QQ();
qq.test("Run test1", function () {
    var _this = this;
    _this.outer = 10;
    Y.prototype.myMethod = function () {
        alert(_this.outer);
    };
});
var y = new Y();
y.myMethod();

この出力を取得するには、TypeScriptを変更する必要があります。

class Y { 
    public myMethod() {

    }
}

class QQ {
    public test(name, fun: () => any) { // updated signature
        fun(); // call the function
    }
}

var qq = new QQ();

qq.test("Run test1", () => {
        this.outer = 10; // use this.
        Y.prototype.myMethod = () => {
            alert(this.outer);
        }
});

var y = new Y();
y.myMethod();

はい、TypeScriptはthis.outerアラートステートメントの問題であると考えていますが、とにかく正しいJavaScriptをコンパイルします。あなたはそれをバグとしてhttp://typescript.codeplex.comで提起することができます。

于 2012-10-29T09:04:52.497 に答える
0

これは、バージョン0.8.2までのTypeScriptのバグであり、それ以降は修正されています。

于 2013-02-01T09:31:11.850 に答える