Javascript/Typescript->;访问函数的上一个作用域
可以在Javascript中访问函数的前一个作用域吗?或者在调用函数时,是否可以自动将“this”指定给typescript中的参数?(所以我有上一个范围) 例如:(在我的类Queryable中定义的函数)Javascript/Typescript->;访问函数的上一个作用域,javascript,scope,typescript,Javascript,Scope,Typescript,可以在Javascript中访问函数的前一个作用域吗?或者在调用函数时,是否可以自动将“this”指定给typescript中的参数?(所以我有上一个范围) 例如:(在我的类Queryable中定义的函数) Where(filter:(part:T)=>boolean):可查询{ var ast=acorn.parse(“(“+filter.toString()+”))。。。 我从外面用它: var aa = new Queryable<ITest>(); var jj = "bb
Where(filter:(part:T)=>boolean):可查询{
var ast=acorn.parse(“(“+filter.toString()+”))。。。
我从外面用它:
var aa = new Queryable<ITest>();
var jj = "bb";
aa.Where(x => x.content == "aa" && x.bb.content == jj || x.form.Contains("Hallo"));
var aa=newqueryable();
var jj=“bb”;
其中(x=>x.content==“aa”和&x.bb.content==jj|x.form.Contains(“Hallo”);
现在在Where函数中,我需要得到“jj”的值
Mabey再多一点代码有助于:
class Queryable<T> {
Where(filter: (part: T) => boolean): IQueryable<T> {
var ast = acorn.parse("(" + filter.toString() + ")");
return null;
}
}
interface String {
Contains(par: String): boolean;
StartsWith(par: String): boolean;
EndsWith(par: String): boolean;
}
interface ITest {
content: string;
form: string;
href: string;
bb: ITest;
cc: ITest[];
}
function test() {
var aa = new Queryable<ITest>();
var jj = "bb";
aa.Where(x => x.content == "aa" && x.bb.content == jj || x.form.Contains("Hallo"));
}
test();
类可查询{
其中(过滤器:(部分:T)=>布尔值):IQueryable{
var ast=acorn.parse(“+filter.toString()+”);
返回null;
}
}
接口字符串{
包含(par:String):布尔值;
StartsWith(par:String):布尔值;
EndsWith(par:String):布尔值;
}
接口测试{
内容:字符串;
形式:字符串;
href:string;
bb:ITest;
抄送:ITest[];
}
功能测试(){
var aa=新的Queryable();
var jj=“bb”;
其中(x=>x.content==“aa”和&x.bb.content==jj|x.form.Contains(“Hallo”);
}
test();
在“Where”中,我需要访问在其参数的函数中使用的变量,我认为不可能访问“previous”范围,除非它是全局范围(请参阅更多)。即使在可能的情况下,您可以访问“this”,它也不允许您访问变量 我建议您重新设计您的方法,并使用而不是变量-类的对象,这些对象的属性设计用于保存所有必需的信息。然后,您将能够传递此类父对象的实例以及函数调用,并根据需要访问其属性 大致如下:
class Queryable<T>
{
public Where(parent: any, filter: (part: T) => boolean): IQueryable<T>
{
var jj = parent.jj;
var ast = acorn.parse("(" + filter.toString() + ")");
return null;
}
}
class Test
{
public jj;
public Run()
{
this.jj = "bb";
let aa = new Queryable<ITest>();
aa.Where(this, x => x.content == "aa" && x.bb.content == this.jj || x.form.Contains("Hallo"));
}
}
类可查询
{
public Where(父级:any,筛选器:(部分:T)=>布尔值):IQueryable
{
var jj=parent.jj;
var ast=acorn.parse(“+filter.toString()+”);
返回null;
}
}
课堂测试
{
公共jj;
公营
{
这是jj=“bb”;
设aa=newqueryable();
aa.其中(this,x=>x.content==“aa”和&x.bb.content==this.jj|x.form.Contains(“Hallo”);
}
}
您的问题很难理解,但是变量jj
应该在第二段代码中可见。如果在“过滤器”中执行lambda,则该变量可见,但我想解析它,并通过网络发送,为此,我需要lambdaw之外的闭包值。acorn.parse应该实现什么?您可以用filter()调用过滤器函数,它将在正确的上下文中执行。不,我需要将函数传递给服务器上的方法并在那里执行它!为此,我需要在函数字符串中包含外部变量的值!您发送给服务器的只是给定函数的字符串表示形式。为了让它继续执行在服务器上,您需要以某种方式发送该函数的整个执行上下文(这是不可能的)然后在服务器端继续执行。所以..你想要的是不可能的。:)问题是,我想保持我们在WPF/Silverlight中使用的相同语法!我知道我可以用另一种方法实现它,但所有其他方法都更复杂!如果在这种情况下不可能,也许我会使用额外的参数way@Amid而这个解决方案如果可以的话,Where函数似乎是一个通用库的一部分,它不应该知道特定的过滤器。他想做的是获取该函数并在服务器上执行它,这实际上是不可能的。或者说,这是一个明智的方法,可以在你的网站中设置一个安全整体。:)完全同意。我没有说这是最好的方法st方法。也许我不够清楚,应该强调“我会建议重新修改你的方法”。我的样本很粗糙,无法用于生产。只是为了说明获得所需行为的可能性。这不会是一个安全漏洞。在我的C#后端中,我使用的是已经过滤过的IQueryable,它只有数据允许用户访问。我现在希望我们可以像在Silverlight/WPF中一样使用它们。我也可以通过字符串查询它们来实现这一点,但我会以类型安全的方式来实现,因此更易于开发!
class Queryable<T>
{
public Where(parent: any, filter: (part: T) => boolean): IQueryable<T>
{
var jj = parent.jj;
var ast = acorn.parse("(" + filter.toString() + ")");
return null;
}
}
class Test
{
public jj;
public Run()
{
this.jj = "bb";
let aa = new Queryable<ITest>();
aa.Where(this, x => x.content == "aa" && x.bb.content == this.jj || x.form.Contains("Hallo"));
}
}