0

为什么这不能按预期工作。(见预期评论)

var Module = function () {
    var public_instance_var;

    function doStuff () {
        Module.doOtherStuff();
        console.log(public_instance_var); // expected: true, but logs undefined
    };

    function doOtherStuff() {
        public_instance_var = true;
    };

    return {
        public_instance_var: instance_var,
        doStuff: doStuff,
        doOtherStuff: doOtherStuff
    }
}();

Module.doStuff();

更新:根据 jAndy 的一些建议进行了相应修复

4

3 回答 3

0

这段代码所做的是,简单地说:创建并运行一个函数并将其返回值分配给一个变量:Module。返回值是一个具有 1 个属性的对象:public_instance_var,它指向变量instance_var,或者(在更正错字之后:public_instance_var)。此变量已声明,但未实例化。因此返回值如下所示:

Module.public_instance_var = undefined

最后一行Module.doStuff();一点用都没有:Module 是一个没有方法的对象。当匿名函数返回时,您声明的函数将被垃圾回收。如果您想访问这些函数,则需要将它们包含在 return 语句中。阅读闭包、对象构造函数和设计模式,但我想说你所追求的代码看起来像这样:

var Module = (function()
    var public_instance_var;
    function doStuff () {
        this.doOtherStuff();
        console.log(public_instance_var); // expected: true, but logs undefined
    };
    function doOtherStuff() {
        public_instance_var = true;
    };
    return {
        public_instance_var: public_instance_var,
        doStuff: doStuff,
        doOtherStuff: doOtherStuff
    };
})();

当然,这样你的变量public_instance_var是一个公共属性,所以我猜你真正想要做的是模拟一个私有属性和方法。在这种情况下,您最终可能会得到与此类似的代码:

var Module = (function()
{
    var public_instance_var;
    return {
        //public_instance_var: public_instance_var, remove this line
        //the closure will preserve access to the variable
        doStuff: function ()
        {
            this.doOtherStuff();//this, you're referencing the object's property
            console.log('here I am');
        },
        doOtherStuff: function ()
        {
            public_instance_var = true;
            //this won't work anymore:
            //this.public_instance_var = true;
        };
    }
})();

Module.doStuff()现在 logs here I am,但doOtherStuff现在也是一个公共方法。以下是您可以选择解决问题的方法:

var Module = (function()
{
    var public_instance_var;
    function doOtherStuff ()
    {
        public_instance_var = true;
    };
    return {
        //public_instance_var: public_instance_var, remove this line
        //the closure will preserve access to the variable
        doStuff: function ()
        {
            doOtherStuff();//don't use this here, but the reference to the function exists thanks to closure
            console.log('here I am');
            console.log(public_instance_var);//logs true
        }
    };
})();

这些只是你可以用闭包和返回对象的函数做的一些非常强大的事情。
只需阅读几篇文章,比如这篇文章,还有更好的文章。谷歌这个词power constructors

于 2012-07-31T12:17:55.683 回答
0

这里有多个错误:

  • 你不DoStuff作为模块接口返回
  • instance_var未声明,可能意味着public_instance_var
  • doOtherStuff从来没有分配给Module,只是把它称为doOtherStuff();

固定代码:

var Module = function () {
    var public_instance_var;

    function doStuff() {
        doOtherStuff();
        console.log(public_instance_var); // expected: true, but logs undefined
    };

    function doOtherStuff() {
        public_instance_var = true;
    };

    return {
        doStuff: doStuff,
        public_instance_var: public_instance_var
    }
}();

Module.doStuff();
于 2012-07-31T11:42:28.700 回答
0

像这样改变你的代码

var Module = function () {
    var public_instance_var;

    function doStuff () {
        doOtherStuff();
        console.log("var is ", public_instance_var); // expected: true, but logs undefined
    };

    function doOtherStuff() {
        public_instance_var = true;
    };

    return {
        public_instance_var: public_instance_var,
        doStuff : doStuff
    }
}();

Module.doStuff();
  • 你必须返回doStuff()函数(否则外部将是未定义的)而public_instance_var不是instance_var
  • 你需要在doOtherStuff()没有前缀的情况下执行Module.
于 2012-07-31T11:46:06.343 回答