Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 模块设计模式封装_Javascript_Module_Modular Design - Fatal编程技术网

Javascript 模块设计模式封装

Javascript 模块设计模式封装,javascript,module,modular-design,Javascript,Module,Modular Design,给定模块设计模式中的代码: var HTMLChanger=(函数(){ var contents='contents' var changeHTML=函数(){ var元素=document.getElementById('attribute-to-change'); element.innerHTML=内容; } 返回{ callChangeHTML:function(){ changeHTML(); 控制台日志(内容); } }; })(); HTMLChanger.callChange

给定模块设计模式中的代码:

var HTMLChanger=(函数(){
var contents='contents'
var changeHTML=函数(){
var元素=document.getElementById('attribute-to-change');
element.innerHTML=内容;
}
返回{
callChangeHTML:function(){
changeHTML();
控制台日志(内容);
}
};
})();
HTMLChanger.callChangeHTML();//输出:“内容”
console.log(HTMLChanger.contents);//未定义
console.log(HTMLChanger.contents);//未定义

HTMLChanger变量被指定给IIFE(立即调用的函数表达式)的返回值。返回值如下所示:

  return {
    callChangeHTML: function() {
      changeHTML();
      console.log(contents);
    }
  };
因此,它被设置为包含一个名为
callChangeHTML
的属性的对象。变量
contents
changeHTML
仅在IIFE的范围内定义,并且不是返回对象的属性(否则,它将破坏此模式的目的,即隐藏实现细节)。IIFE之外的代码绝对无法访问它们,除非向返回的对象添加更多函数,如getter和setter。看起来是这样的:

var HTMLChanger=(函数(){
var contents='contents'//这只是一个变量!不是属性!
var changeHTML=函数(){
var元素=document.getElementById('attribute-to-change');
element.innerHTML=内容;
}
返回{
callChangeHTML:function(){
changeHTML();
控制台日志(内容);
},
getContents:function(){
返回内容;
}
};
})();
HTMLChanger.callChangeHTML();//输出:“内容”
console.log(HTMLChanger.getContents());//还输出“内容”
console.log(HTMLChanger.contents);//未定义

HTMLChanger变量被指定给IIFE(立即调用的函数表达式)的返回值。返回值如下所示:

  return {
    callChangeHTML: function() {
      changeHTML();
      console.log(contents);
    }
  };
因此,它被设置为包含一个名为
callChangeHTML
的属性的对象。变量
contents
changeHTML
仅在IIFE的范围内定义,并且不是返回对象的属性(否则,它将破坏此模式的目的,即隐藏实现细节)。IIFE之外的代码绝对无法访问它们,除非向返回的对象添加更多函数,如getter和setter。看起来是这样的:

var HTMLChanger=(函数(){
var contents='contents'//这只是一个变量!不是属性!
var changeHTML=函数(){
var元素=document.getElementById('attribute-to-change');
element.innerHTML=内容;
}
返回{
callChangeHTML:function(){
changeHTML();
控制台日志(内容);
},
getContents:function(){
返回内容;
}
};
})();
HTMLChanger.callChangeHTML();//输出:“内容”
console.log(HTMLChanger.getContents());//还输出“内容”

var contents
的作用域是您的HTMLChanger函数——它不是静态的。这两行没有区别,都会导致
未定义的结果
HTMLChanger
{callChangeHTML:function(){…}
对象,它没有
.contents
属性。@JeremyHarris问题edited@Bergi问题编辑我不明白这个问题。如果我们使用显示模块模式只显示我们想要的信息,那么只显示我们想要的信息有什么好处?
var contents
的作用域是您的HTMLChanger函数——它不是静态的。这两行没有区别,并且都会导致
未定义的
HTMLChanger
{callChangeHTML:function(){…}
对象,它没有
.contents
属性。@JeremyHarris问题edited@Bergi问题编辑我不明白这个问题。如果我们使用显示模块模式只显示我们想要的信息,那么只显示我们想要的信息有什么好处?