【问题标题】:Javascript/Typescript -> Access Previous scope of a functionJavascript/Typescript -> 访问函数的先前范围
【发布时间】:2016-03-12 14:32:30
【问题描述】:

是否可以在 Javascript 中访问函数的先前作用域?或者在调用函数时是否可以自动将“this”分配给打字稿中的参数? (所以我有以前的范围)

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

    Where(filter: (part: T) => boolean): Queryable<T> {
    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"));

现在在我的 Where 函数中,我需要获取“jj”的值

也许更多代码会有所帮助:

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();

在“Where”中,我需要访问在他的参数中的函数中使用的变量

【问题讨论】:

  • 您的问题很难理解,但变量jj 应该在第二段代码中可见。
  • 如果你在“过滤器”中执行 lambda 是可见的,但我想解析它,并通过网络发送它,为此我需要 lambda 之外的闭包值
  • acorn.parse 应该实现什么?您可以使用 filter() 函数调用过滤器,它将在正确的上下文中执行。
  • 不,我需要将函数传递给我服务器上的一个方法并在那里执行它!为此,我需要在函数字符串中包含外部变量的值!
  • 您发送到服务器的只是给定函数的字符串表示形式。为了让它继续在服务器上执行,您需要以某种方式发送该函数的整个执行上下文(这是不可能的)并继续在服务器端执行。所以..你想要的是不可能的。 :)

标签: javascript scope typescript


【解决方案1】:

我认为它不可能访问“以前的”范围,除非它的全局范围(见更多here)。即使在可能的情况下,您可以获得对“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"));
    }
}

【讨论】:

  • 问题是,我想保持我们在 WPF/Silverlight 中使用的相同语法!我知道我可以通过另一种方式实现它,但所有其他方式都更复杂!也许我会为此使用额外的参数,如果以这种方式不可能的话
  • @Amid 虽然这个解决方案可以工作,但看起来 Where 函数是通用库的一部分,它不应该知道特定的过滤器。此外,他想要做的是获取该功能并在服务器上执行它,这实际上是不可能的。或者建议,这是在您的网站中放置安全整体的可靠方法。 :)
  • 完全同意。我没有说这是最好的方法。也许我不够清楚,应该强调“我建议重新设计你的方法”。我的样品很粗糙,不能用于生产。仅作为获得所需行为的可能性的说明。
  • 这不是安全漏洞。在我的 C# 后端中,我已经使用了一个过滤的 IQueryable,它只有允许用户访问的数据。我现在希望我们可以像在 Silverlight/WPF 中一样使用它们。我也可以通过字符串查询它们来实现这一点,但我会以一种类型安全的方式进行,所以更容易开发!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2011-11-13
  • 1970-01-01
  • 2012-05-25
  • 2016-04-04
  • 2018-12-22
  • 1970-01-01
相关资源
最近更新 更多