0
var foo = (function() {
    var proxy = {},
        warning = false;

    proxy.warn = function(msg) {
        if (!warning) {
            warning = true;
            alert(msg);
        }
        return this; //For the purpose of method chaining we return proxy object.
    }

    function func() {
        alert(warning); //This is a private function relative to foo.
    }

    return proxy;
}());

foo.warn(); //will alert
foo.warn(); //will not alert since warning has been set to true

我对这里的实例化感到困惑,因为没有使用新关键字谁持有警告值?就范围警告而言,这里是否有任何泄漏。

谢谢你。

4

4 回答 4

2

a住顶闭功能function() {...

foo 持有您要返回的代理对象,这意味着不在此代理对象中的所有内容都是私有的,无法从 foo 访问。如果你想获得的值,a你可以添加一个返回 a => 的新函数

proxy.getValueOfA=function(){return a}

然后你可以打电话foo.getValueOfA()

作为评论:

var proxy={}

是的缩写形式,var proxy=new Object()所以有一个实例化。

于 2009-12-18T00:28:41.033 回答
1

这个

    return proxy;
}());

应该是这个

    return proxy;
})();

和这个

function() {
     alert('test');
     return 42;
}();

不起作用...语法错误。你应该先试试你的代码,然后再把它放在这里。很确定你的意思是:

(function() {
     alert('test');
     return 42;
})();

此外,您返回私人成员的事实破坏了范围关闭的全部意义,但它会起作用......

var foo = (function() {
    var proxy = {}, // private
    proxy.warn = function(msg) {
    ...
    return proxy; // publicly accessible

var foo = { warn: function(){ /* code */ } };
于 2009-12-18T01:14:37.273 回答
1

这个对另一个问题的回答确实帮助我扩展了对 javascript 对象如何工作的理解:

JavaScript 函数别名似乎不起作用

至于你的代码片段,让我们分解一下。首先看一下高层结构: var foo = ( exrpession );. 你可以很容易地说:var foo = expression;,但是 IIRC 需要括号来处理特定于 IE 的怪癖。

现在,在这种情况下,表达式是一个匿名函数。Javascript 非常适合您定义一个没有名称的函数。除非您在某处保存参考,否则不要期望调用它。您还可以在声明后立即调用匿名函数,如下所示:

function() {
     alert('test');
     return 42;
}();

这应该看起来与代码片段中用于表达式的基本结构非常相似。希望您可以轻松地看到42我的示例中的 the 可以很容易地成为一个对象。

所以问题仍然存在,你为什么要这样做?请记住,在 javascript 中,函数也是对象。作为 OOP 的好学生,您可能希望将对象的某些成员设为私有。但是,javascript 没有任何内置功能来支持这一点。幸运的是,如果您从该内部函数返回一个对象,它将可以访问该函数中定义的其他变量,但外部代码将无法访问它们。因此,您实际上已经创建了一个具有私有成员的对象。

于 2009-12-18T00:28:37.260 回答
1

两者proxy.methodfunc可以a通过闭包 属性访问。有关范围和对象的更多信息,请查看最近出现的这篇文章: JavaScript 对象、变量、函数和原型的简明、可执行指南

您发布的代码符合所谓的“模块模式”,并且正在成为在 JavaScript 中定义对象的一种非常流行的方式,因为它使私有变量和方法易于创建(通过利用前面提到的闭包属性) .

于 2009-12-18T00:49:00.957 回答