更新模块模式中的变量

时间:2011-06-30 03:40:30

标签: javascript jquery

我正在尝试通过模块模式设置私有变量的值。 所以我所说的是将$ content设置为我传递给person.content的值。但这似乎不起作用,因为当我对值进行警报时,它会给我一个未定义的错误。

$(document).ready(function(){
    person.content = $('#content');
    person.getContent();

});

// Person Module
var person = ( function(){

        var $content;


        function getContent(){
                alert( 'content = '+$content.find(':first h2').text());
        }

        return { 
            content: $content,
            getContent : getContent,

        }

    }( ) );

2 个答案:

答案 0 :(得分:5)

当你这么说时,你的问题是:

person.content = $('#content');

您不是在更改函数内的var $content;,而只是更改contentperson属性的值。然后,当你这样说:

person.getContent();

内部getContent函数将在外部函数中使用(未初始化的)var $content。您需要添加setContent函数:

var person = (function(){
    var $content;
    function setContent(c) {
        $content = c;
    }
    // ...
    return {
        setContent: setContent,
        getContent: getContent
    };
}());

并确保不要在返回对象中留下该逗号,大多数(所有?)版本的IE都会对此感到不安。

然后,在其他地方:

person.setContent($('#content'));
person.getContent();

根据您的目标浏览器和版本,您可以为返回对象的属性定义getter和setter函数:

但是使用显式的mutator函数将无处不在。

答案 1 :(得分:0)

将对象中的值想象为指针。

person是一个对象,其中content属性指向闭包中的$content值。当您执行person.content = somethingElse时,您将人员对象的content属性设置为指向somethingElse

从中取出封闭,这说明了同样的事情:

var a = 'a';
var b = 'b';

var obj = { a: a }
alert(obj.a) // "a"

obj.a = b;
alert(obj.a) // "b"
alert(a) // "a"

将对象属性设置为新对象,永远不会对曾经在那里分配的对象做任何事情。它只是指向一个新的不同的对象。

分配这个内部私有变量的唯一方法是从闭包内部开始,就像在setContent方法中一样。

return {
  getContent: function() { return $content; },
  setContent: function(val) { $content = val; }
};