gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:15:10 26 4
gpt4 key购买 nike

在一个典型的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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com