[英]Invoke javascript function from string
我的javascript模塊中有以下代碼,但是這需要我讓外部世界可以看到這些函數。
var mymodule = function() {
var self = null,
init = function () {
self = this;
$('.actionButton').click(function () {
var worklistId = $(this).data('worklistid'),
action = $(this).data('action');
self[action] && self[action](worklistId); //watchout methods marked as not used are used by this invocation
})
},
send = function () {
// some logic
},
finish = function () {
// some logic
},
delete = function () {
// some logic
};
return {
init: init,
send: send,
finish: finish,
delete: delete
};
}();
mymodule.init();
所以我想在模塊中返回的唯一東西就是init函數。 但是當我這樣做時,我無法調用這些函數,因為對象(self)只包含外部可見的init函數。
return {
init: init
};
是否有任何解決方案可以調用我的功能,而不會讓外界看到它們? 請不要if else語句,因為我的工作流程比本例中的3個動作大。 我想讓我的模塊盡可能關閉,因為這會減少依賴性。
更新
這是一個更新的jsfiddle,其中一個提議的解決方案,但這給了我另一個問題。 http://jsfiddle.net/marcofranssen/bU2Ke/
是的,有一種簡單(但可能稍微凌亂)的方法,你可以做到這一點,而不會使函數對全局對象可見:
var privateFunctions = { deleter: deleter, send: send};
然后,而不是self[action]();
,只需做privateFunctions[action]();
而你很高興。
請注意,我將delete
更改為deleter
,因為delete
是保留關鍵字...
像這樣的東西會起作用:
var mymodule = function() {
var self = this;
init = function () {
$('.actionButton').click(function () {
var worklistId = $(this).data('worklistid'), action = $(this).data('action');
self[action] && self[action](worklistId); //watchout methods marked as not used are used by this invocation
})
}
self.send = function () {
console.log('send');
}
self.finish = function () {
console.log('finish');
}
self.delete = function (item) {
console.log('delete');
};
return {
init: init,
};
}();
mymodule.init();
這是小提琴:
http://jsfiddle.net/yngvebn/SRqN3/
通過設置self
-variable來this
,外界init
功能全,和附加的send
, finish
和delete
功能的自我,你可以使用self[action]
語法從內init
-function
var mymodule = function() {
var self = {},
init = function () {
$('.actionButton').click(function () {
var worklistId = $(this).data('worklistid'),
action = $(this).data('action');
self[action] && self[action](worklistId); //watchout methods marked as not used are used by this invocation
})
};
self.send = function () {
// some logic
};
self.finish = function () {
// some logic
};
self.delete = function () {
// some logic
};
return{
init:init
}
}();
mymodule.init();
這應該工作!!
即使您僅使用init屬性返回一個對象,並且您動態填充其余對象以使您的模塊使用它們,您仍然可以在運行時將它們顯示在外部。 任何想要調試模塊的人都可以輕松找到他們。
您仍然可以在運行時創建匿名方法,並且它們也可以與其實現一起顯示。
在你的代碼示例中,“ self
”實際上是模糊的。 你應該保持簡單,使用封裝函數作為“私有”方法,並返回一個“公共”(或“特權”,如Crockford稱之為)可以訪問它們的函數。
這是使用私有函數和變量進行單例的YUI方式。 示例模式:
var mymodule = (function() {
var internal = {
'send': function() {},
'finish': function() {},
'delete': function() {}
};
return {
'init': function(action) {
// access to internals, f.ex:
if ( internal.hasOwnProperty(action) ) {
internal[action].call(this); // bring the caller context
}
}
};
}());
mymodule.init('send');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.