我正在读一本名为"学习javascript设计模式的书#34;作者:Addy Osmani。这本书很棒。
有一个使用揭示设计模式的例子:
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.RECORD_AUDIO)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this, permissions, REQUEST_RECORD_AUDIO_PERMISSION);
}
}
现在,我当然理解它是如何工作的,但我的问题更简单 - 在常规的经典节点webapp中使用它的用例是什么?
让我们说我有一个汽车模块,我希望在某些程序中创建。在这种情况下,我无法看到如何使用该模式。如何传递参数以生成var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
?
我应该将此模式用于单身人士吗?创建工厂?
答案 0 :(得分:1)
此模式用于封装一些私有状态,同时公开(“揭示”)公共接口。
这种模式可以有很多用例,但在它的核心部分,它展示了如何将实现(私有变量)与API(暴露的函数)分开,这在javascript中实现并非易事。
每当有一个具有状态的模块时,最好使用它。
要提供参数,只需公开一个接受参数的API函数,例如
return {
createCar: function(model, mileage) { ... }
}
答案 1 :(得分:0)
JavaScript是一种奇怪的语言,如果你不遵循最佳实践并且你不熟悉ECMA标准,有时会做一些奇怪的事情。 JavaScript语法中有许多奇怪的东西,其中一个是自执行(自动调用)函数......
您可以在此处阅读更多详细信息
http://blog.mgechev.com/2012/08/29/self-invoking-functions-in-javascript-or-immediately-invoked-function-expression/
您可以传递这样的参数:
https://jsfiddle.net/6bhn80oz/
答案 2 :(得分:0)
我在创建服务时经常在角度1中使用它。对我来说,更容易知道我可以在服务中访问哪些方法和/或变量,并将其他所有内容保留在return {}
私有之外。
angular.module('myModule')
.factory('someService', function () {
function myFunction(){
}
return{
getSomething:myFunction
}
});