是否可以以全局函数方式调用非全局函数? (即不使用限定符) e.g。
var lib = {
notGlobalFn: function(){ /*...*/ }
};
var foobar = function(){
notGlobalFn();
};
foobar();
我自己可以想到三个解决方案(下面列出),但我希望有另一个解决方案不使用全局函数或者这个。上下文或子功能。有没有其他方法可以做到这一点? (或者我有太多的限制/我是一个学究?)
我的重点是简洁,能够在lib的上下文之外定义foobar函数(即我可以定义一个库,让人们以本地上下文的方式使用它)。
测试: http://jsbin.com/denawa/5/edit?javascript,console
解决方案#1: - 使用子功能
因为foobar已集成到lib中而被拒绝。
var lib = function(){
var notGlobalFn = function(){ /*...*/ }
return {
foobar: function(){
notGlobalFn();
}
}
};
lib().foobar()
解决方案#2: - 设置/取消设置全局功能
因为使用了全局函数而被拒绝。
notGlobalFn = lib.notGlobalFn
foobar();
notGlobalFn = undefined
解决方案#3: - 使用上下文
拒绝,因为他们正在使用限定符。
var foobar = function(){
this.notGlobalFn();
};
foobar.call(lib);
OR
var foobar = function(){
lib.notGlobalFn();
};
foobar();
总而言之,如果我必须选择上述方法之一,我会选择解决方案#2 。
**编辑**
另一种解决方案: - 使用本地变量(解决方案#3的扩展名)。
var foobar = function(){
var notGlobalFn = lib.notGlobalFn
notGlobalFn();
};
和另一个解决方案: - 将notGlobalFn添加到'this'(我认为这不会起作用)。
function init(scope){
scope.notGlobalFn = lib.notGlobalFn
}
var foobar = function(){
init(this)
notGlobalFn()
};
答案 0 :(得分:-1)
这是我最终选择的解决方案。不确定为什么这会被低估/关闭,没有人要求澄清!
function init(scope){
scope.notGlobalFn = lib.notGlobalFn
}
var foobar = function(){
init(this)
notGlobalFn()
};