这是闭包意味着要避免的,但我想知道是否有办法向闭包添加方法。基本上我有一个js文件库,我想通过添加一个新方法来增加特定客户端。
我有一个名为library的js文件:
var LIBRARY = (function(){
var name;
return {
setName: function(n) { name = n; }
}());
但是对于一个新的客户端,我想给他们一个新的js文件,它只会增加LIBRARY,添加一个新函数:
function(first, last){
name = first + " " + last;
}
我不想修改库js。有没有办法将此函数附加到LIBRARY,以便该函数具有对 name 变量的必要访问权限?
答案 0 :(得分:1)
不,不幸的是,你不能 - 或者至少不能以合理的方式。只有该闭包中定义的函数才能访问该局部变量。
执行此操作的不合理方法是使用eval
玩游戏,但我强烈反对。
您所能做的就是向LIBRARY
添加不需要直接访问该变量的函数。
答案 1 :(得分:0)
不确定你是如何设想“追加”的,但这是有效的
// Base
var LIBRARY = (function(){
var name;
return {
setName: function(n) { name = n; }
, getName: function() { return name; }
}
}());
// Extension
LIBRARY.setFullName = function( first, last )
{
this.setName( first + " " + last );
}
// Test
LIBRARY.setFullName( 'Peter', 'Bailey' );
alert( LIBRARY.getName() );
答案 2 :(得分:0)
所以我只想留下一个关于我是如何实现这一目标的说明,因为它强调了一种不同的思考JS架构的方式。
如前所述,我希望能够使用特定于客户端的功能扩充我的库。我最终做的是修改我的库以阅读:
var LIBRARY = (function(){
var name;
var settings;
return {
init: function(options){
jQuery.extend(settings, options); // just merges two objects together
}
setName: function(n) { name = n; }
custom: function(){
if (!settings.custom || typeof(settings.custom == 'function'))
return;
name = settings.custom.apply(this, arguments);
}
}());
然后客户端库使用如下函数扩充我的LIBRARY:
LIBRARY.init({ custom: function(first, last) {
return first + " " + last;
} });
所以现在客户端代码可以调用:
LIBRARY.custom("static", "hippo");
和 name 将设置为“static hippo”