闭包无法访问功能

时间:2015-04-19 05:40:22

标签: javascript closures

我想了解闭包。在下面的代码中,我创建了构造函数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());

3 个答案:

答案 0 :(得分:2)

请改为尝试:

&#13;
&#13;
var kawazaki = new Ninja;

kawazaki.feints();

alert(kawazaki.getFeints());

function Ninja() {
    var feints = 0;

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

    this.feints = function () {
        feints++;
    };
}
&#13;
&#13;
&#13;

您需要在构造函数中将公共属性赋予this

答案 1 :(得分:0)

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

为了能够执行kawazaki.feints(),您必须&#34;附加&#34; Ninja函数的函数,作为一个对象(函数也是)

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

答案 2 :(得分:0)

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

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.