Javascript,摆脱“ this”并使用本地范围
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Javascript,摆脱“ this”并使用本地范围,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2932字,纯文字阅读大概需要5分钟。
内容图文
![Javascript,摆脱“ this”并使用本地范围](/upload/InfoBanner/zyjiaocheng/679/4cc7d2f1b2694514aacb7ad88b3dd866.jpg)
在典型的js类中,所有对成员函数的调用必须在此之前.我正在寻找一种技术,该技术可以让我创建一个相互依赖的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”提出建议,这让我感到很奇怪,因为它默认为window,如果可以指向它,那会不会很好附加了本地作用域的匿名对象.
我很想说[‘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.这也使以下声明式样式成为“这场噩梦”:
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都可用.
解决方法:
如果我理解正确,则需要创建以下对象:
>具有静态成员
> …无需使用此符号即可访问
最简单的解决方案(假设我已经正确理解了您的查询),将是简单地使用闭包来存储您的stratic字段,直接按名称访问它们,然后显式将它们添加为对象成员.
考虑:
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”并使用本地范围全部内容,希望文章能够帮你解决Javascript,摆脱“ this”并使用本地范围所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。