为什么这个javascript对象在使用和不使用模块模式时表现不同?

为什么这个javascript对象在使用和不使用模块模式时表现不同?,javascript,function,object,module,Javascript,Function,Object,Module,我有以下带有和不带模块模式的代码。我已经在执行的旁边给出了结果。在模块模式中,我可以更改foo和set_inner,而在函数对象(非模块)中,我不能更改foo和set_inner module pattern: var someObj = (function () { var instance = {}, inner = 'some value'; instance.foo = 'blah'; instance.g

我有以下带有和不带模块模式的代码。我已经在执行的旁边给出了结果。在模块模式中,我可以更改foo和set_inner,而在函数对象(非模块)中,我不能更改foo和set_inner

module pattern:
var someObj = (function () {
     var instance = {},         
     inner = 'some value';      
     instance.foo = 'blah';      
     instance.get_inner = function () {         
         return inner;     };      
     instance.set_inner = function (s) {        
         inner = s;     };     
     return instance; })(); 

someObj.get_inner();//some value
someObj.set_inner("kkkk");
someObj.get_inner();//kkk
someObj.foo;//blah
someObj.foo="ddd";
someObj.foo;//ddd

non-module:
var someObj = function () {     
    var instance = {},         
    inner = 'some value';      
    instance.foo = 'blah';      
    instance.get_inner = function () {        
        return inner;     };      
    instance.set_inner = function (s) {         
        inner = s;     };      
    return instance; }; 

someObj().get_inner();//some value 
someObj().foo;//blah 
someObj.foo="aaa"; 
someObj().foo;//blah 
someObj().set_inner("kkk"); 
someObj().get_inner();//some value 
非常感谢您的帮助。谢谢

您的“模块”示例创建一个对象,该对象由
实例
引用。立即调用匿名函数,并返回该对象。所以
someObj
指的是
实例

“非模块”示例每次调用时都会创建一个新对象。匿名函数不会立即调用。相反,每次您想使用它时都必须调用它

如果将返回值赋给一个变量并引用该变量,而不是重复调用
someObj
,则其行为方式相同:

var obj = someObj();
obj.get_inner(); //some value
obj.foo; //blah
obj.foo="aaa";
obj.foo; //aaa
//etc...

谢谢,在我声明internal='some value'之前我需要关键字'var'吗?internal不是实例的属性,但是get_inner和set_inner是实例上访问internal的方法。他们能进入这里是因为关闭,对吗?或者是内部,instanceYes的属性,
get\u inner
set\u inner
可以通过闭包访问
inner
internal
变量是匿名函数的局部变量,但由于该闭包而保留了对它的引用。