Javascript TypeScript关闭作用域错误:当前作用域中不存在该名称

Javascript TypeScript关闭作用域错误:当前作用域中不存在该名称,javascript,typescript,Javascript,Typescript,有人知道为什么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: Th

有人知道为什么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;
    };
});

外部函数在其闭包中声明了一个变量“outer”,内部函数自然可以看到它。

缩短为仅突出点:

这就是我认为您期待的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认为这是alert语句中的一个问题,但是编译了正确的JavaScript。您可以在以下位置将其作为一个bug提出。

仅限于要点:

这就是我认为您期待的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认为这是alert语句中的一个问题,但是编译了正确的JavaScript。你可以把它作为一个bug提出来。

在verion 0.8.2之前,这是TypeScript中的一个bug。在verion 0.8.2之前,这是TypeScript中的一个bug。我不太明白。这里有两个lambda表达式。外部lambda定义一个变量“outer”,然后将内部lambda分配给某个对象的原型。外部lambda定义了一个闭包,这意味着外部闭包中的所有对象都应该在内部闭包中可见。这是非常标准的JavaScript——一点也不奇怪。我相信这是TypeScript编译器中的一个错误。@NoelAbrahams需要澄清-我已经发布了一个JavaScript示例,并询问您期望的差异。@Sohnee,我已经编辑了这个问题以显示预期的结果。你提出的解决方案在我看来并不自然,lambda中的“this”似乎很奇怪。如果没有其他问题的话,我会把它当作臭虫提出来。谢谢。苏尼,我不太明白。这里有两个lambda表达式。外部lambda定义一个变量“outer”,然后将内部lambda分配给某个对象的原型。外部lambda定义了一个闭包,这意味着外部闭包中的所有对象都应该在内部闭包中可见。这是非常标准的JavaScript——一点也不奇怪。我相信这是TypeScript编译器中的一个错误。@NoelAbrahams需要澄清-我已经发布了一个JavaScript示例,并询问您期望的差异。@Sohnee,我已经编辑了这个问题以显示预期的结果。你提出的解决方案在我看来并不自然,lambda中的“this”似乎很奇怪。如果没有其他问题的话,我会把它当作臭虫提出来。谢谢