this
关键字。我看了一种技术,可以让我创建一个相互依赖的静态函数库,并依赖于闭包/作用域,使事情变得更容易一些。例如:
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
默认为window,这总让我感到奇怪,如果this
可以指向一个附加了本地作用域的匿名对象,那不是很好吗。我想说
['localObject']
以获取作用域中的内容。编辑:
看到一些回答后,我将把它重新阐述为一个挑战:
我正在寻找一种语法技巧,一种方式来像@Varuna所说的那样,“1.访问静态方法而不使用此变量,即它们将保持彼此全局。2.不想维护本地数组以实现静态方法,并希望在本地范围内实现。”
换句话说,我需要声明的函数自行注册,但我不想多次声明函数名。我想@Varuna可能有一种使用eval访问本地作用域的解决方案。
以下方法不起作用:
var o={};
o['fn']=function fn(){};
o['fn2']=function fn2(){};
因为你需要两次声明函数名称,但是闭包得以保留。
而这个:
var a=[
function fn(){}
,function fn2(){}
];
Register(a);
不起作用,因为据我所知,你会失去闭包,即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,但据我所知并非在所有情况下都可用。
this
有什么问题? - Bergi