Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript/Typescript->;访问函数的上一个作用域_Javascript_Scope_Typescript - Fatal编程技术网

Javascript/Typescript->;访问函数的上一个作用域

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

可以在Javascript中访问函数的前一个作用域吗?或者在调用函数时,是否可以自动将“this”指定给typescript中的参数?(所以我有上一个范围)

例如:(在我的类Queryable中定义的函数)

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"));
    }
}