Javascript,远离 'this' 并使用本地范围

标签 javascript

在一个典型的js类中,所有对成员函数的调用都必须在this之前。我正在寻找一种技术,它可以让我创建一个相互依赖的 STATIC 函数库,并依靠闭包/作用域使事情变得更容易一些。

例子:

var Singleton={
  //main entry point
  // call with fn name, args...
  call:function(){
    var args=[];
    if (arguments.length==0) {
      return;
    }
    // get the fn name
    var fn=arguments[0];
    var x;
    // make args array
    for (x=1;x<arguments.length;x++) {
      args[args.length]=arguments[x];
    }
    // I want to get rid of this part
    // See below for what I wish
    // Here I have access to fns below due to hoisting in js
    // so I put them in a map...
    var fns={
      test:test
      // etc, more like this I do not want to type/maintain
    }
    // ... all so I can do this
    // get my function.
    var fun=fns[fn];
    // instead of that, I would like to "override whitespace" and
    // say something like:
    // var fun=['fn_name'];
    // so I can index into local scope and get a fn
    //
    // log error if not found
    if (typeof fun=='undefined') {
      loge('Singleton: function not found:'+fn);
      return;
    }
    // ok, run the function
    return fun.apply(window,args);
    // the test fn accesses test2() without dot notation
    function test(a){
      // Note: here in test fn it can access test2() 
      // without using this.test2() syntax
      // as you would in normal objects
      var s=test2();
      alert(s+' test:'+a);
    };
    function test2(){
      return 'test2';
    };
  }
}

我希望更熟悉 javascript 进步的人可以就如何模拟“隐含但不必要的 this”提出建议,this 总是让我感到奇怪默认为窗口,如果 this 可以指向一个附加了本地作用域的匿名对象,那岂不是很好。

我很想说 ['localObject'] 来获得范围内的东西。

编辑:

在看到一些回复后,我将以挑战的形式重申这一点:

我正在寻找的是一种语法作弊,一种方法,正如@Varuna 所说,“1. 访问静态方法而不使用此变量,即它们将彼此保持全局。2. 不想维护一个静态方法的本地数组,并希望在本地范围内实现。”

换句话说,我需要让声明的函数自己注册,但我不想多次声明函数名称。我想@Varuna 有一个使用 eval 访问本地范围的解决方案。

以下方法行不通:

var o={};
o['fn']=function fn(){};
o['fn2']=function fn2(){};

...因为您必须声明 fn 名称两次,但保留了闭包。

还有这个:

var a=[
  function fn(){}
  ,function fn2(){}
];
Register(a);

不会工作,因为 AFAIK,你失去了关闭,即。 fn2 看不到 fn。这也使以下声明式样式成为“this 噩梦”:

window.MINE={
  fn:function fn(){
    //this?
    // want to say fn2(), not this.fn2(), nor MINE.fn2()
  }
  ,fn2:function fn2(){
    //this?
  }
  ,deeper:{
    //more
  }
};

但是,如果您创建了一个怪异的属性来在分配时进行注册,那么这样的事情可能会奏效:

var registar=new Registar();
registar.reg=function fn(){};
registar.reg=function fn2(){};
//then access
var fn=registar.getFn(n);
// or
var fn=registar._[n];

以上依赖于 js 属性和对 fn.name 的访问权限,这在 AFAIK 并非在所有情况下都可用。

最佳答案

如果我没理解错的话,你想要创建的对象:

  • 有静态成员
  • ...无需使用 this 符号即可访问

最简单的解决方案(假设我已经正确理解了您的查询)是简单地使用闭包来存储您的静态字段,通过名称直接访问它们,然后显式地将它们添加为对象成员。

考虑:

var myConstructor = (function(){

    var foo = 'someStaticField';
    var bar = function(){
        alert('A static method returns ' + foo);
    };

    return function(){
        return {
            foo : foo,
            bar : bar
        };
    };

})();
var myInstance = new myConstructor();

关于Javascript,远离 'this' 并使用本地范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23720665/

相关文章:

javascript - 从实例变量名中找出实例变量名

javascript - 为什么我的谷歌地图 Lat/Lng 变量不存储任何内容?

javascript - 使用 JQuery 或 Javascript 编辑 HTML 评论文本

javascript - 理解php代码并在24小时内调用一次javascript函数

javascript - 使用 ng-style 进行背景渐变时出现 AngularJS 语法错误

java - 为什么我的 Javascript 返回 [object HTMLScriptElement] 而不是预期的文本?

javascript - 在 Node 中配置 Twitter Passport 以允许经过身份验证的用户发布推文

javascript - 使用 javascript 设置和检查 cookie

javascript - 字段变化触发功能

javascript - CQ5 ECMA 脚本获取对服务的引用