闭包无法访问函数

Closures Cannot access a function

我想了解闭包。在下面的代码中,我创建了构造函数 Ninja 的实例,并调用该实例 kawazaki。我希望能够访问 Ninja 的方法。但是,我得到的是 TypeError: Object #<Ninja> has no method 'feints'

我预期的输出是 1

这是我的代码:

function Ninja() {
    var feints = 0;

    function getFeints() {
        return feints;
    }

    function feints() {
        feints++;
    }
}

var kawazaki = new Ninja();

kawazaki.feints();

console.log(kawazaki.getFeints());

试试这个:

var kawazaki = new Ninja;

kawazaki.feints();

alert(kawazaki.getFeints());

function Ninja() {
    var feints = 0;

    this.getFeints = function () {
        return feints;
    };

    this.feints = function () {
        feints++;
    };
}

您需要在构造函数中将 public 属性分配给 this

函数getFeintsfeints的范围仅限于函数Nija。由于您无法访问函数中声明的变量,因此您无法访问这些函数。

为了能够执行 kawazaki.feints(),你必须 "attach" 函数到 Ninja 函数,作为一个对象(函数也是)

您将在这些资源中找到实现该目标的几种方法,以及一些更深入的解释:

闭包是一个非常简单但在很大程度上被误解的话题。

function Ninja() {
    var feints = 0;

    function getFeints() {
        return feints;
    }

    function feintsInc() {
        feints++;
    }

}

您已经正确定义了闭包,但请注意,闭包实际上并不是对象的方法。为了获得所需的输出,您需要在关闭对象之前调用闭包。

feintsInc();
getFeints();

但是,如果您希望按照

kawazaki.feintsInc();

您需要在函数中使用 this 关键字来获取分配给对象的函数。

Note,make sure your functions and variable names don't overlap.