以全局函数方式调用本地函数?

时间:2014-08-15 02:17:54

标签: javascript

是否可以以全局函数方式调用非全局函数? (即不使用限定符) 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()
};

1 个答案:

答案 0 :(得分:-1)

这是我最终选择的解决方案。不确定为什么这会被低估/关闭,没有人要求澄清!

function init(scope){
  scope.notGlobalFn = lib.notGlobalFn
}
var foobar = function(){
  init(this)
  notGlobalFn()
};