【问题标题】:Is it not possible to get the arguments array from a static method?不能从静态方法中获取参数数组吗?
【发布时间】:2015-12-31 23:57:03
【问题描述】:

我正在尝试从静态方法中获取保留关键字 arguments 数组,但出现此错误:

1042: this 关键字不能在静态方法中使用。它只能 可用于实例方法、函数闭包和全局代码。

这是我的代码:

public static function doSomething(message:String, ...Arguments):void {
    var object:Object = this.arguments.caller;
}

如果我取出 this 关键字,则会收到以下错误:

1120:访问未定义的属性参数。

【问题讨论】:

  • 仅供参考:.caller 在 AS3 中被删除,有一个 .callee... 在 AS3 中,使用 ...XXX 作为最后一个参数是使用关键字 ...(rest) 并且该参数是数组(所以你有索引器和长度,但没有 .caller (在 AS3 中删除,没有 .callee (AS3)。如果你不使用 ...rest 并因此有固定数量的参数
  • 这根本不应该编译,你应该恢复严格模式。还有参数!= 参数。

标签: actionscript-3 flash


【解决方案1】:

this 保留用于引用类的当前实例,不幸的是,该实例不存在于静态函数中(因为静态函数未绑定到实例)。

如果您想传入未知数量的参数,可以尝试使用新的 rest 关键字:

ActionScript 3.0 包含一个推荐的新 ...(rest) 关键字,而不是 arguments 类。

但是,如果您只想获取调用者函数:

与以前版本的 ActionScript 不同,ActionScript 3.0 没有 arguments.caller 属性。要获得对调用当前函数的函数的引用,您必须将对该函数的引用作为参数传递。这种技术的一个例子可以在 arguments.callee 的例子中找到。

public function test() {
    doSomething("Hello", arguments.callee);
}

public static function doSomething(message:String, caller:Function):void {
    var object:Object = caller;
}

【讨论】:

    【解决方案2】:

    您可以获得静态方法的arguments。来自文档:

    在函数体中,您可以使用局部参数变量访问其参数对象。

    您不需要 this 关键字,this 引用 Class 实例而不是 function 本身:

    public static function doSomething():void {
        return arguments;
    }
    

    接下来就可以访问arguments调用静态方法了:

    var arguments:Object = MyClass.doSomething();
    trace( arguments.callee );
    

    但请记住,就像@MartinKonecny 所说,在AS3 中最好使用...rest 关键字或将function 引用作为参数传递。

    【讨论】:

    • 我以前没见过,但又遇到了。是的,arguments 变量在静态方法中,但@Sushihangover 提到了一个例外。使用 ...rest 参数时,arguments 局部变量不可用。当我取出 ...rest 时,参数变量可以再次访问。
    【解决方案3】:

    arguments 对象在静态函数中可用,但在使用 ...rest 参数时不可用。

    使用此参数会使参数对象不可用。虽然 ... (rest) 参数为您提供与 arguments 数组和 arguments.length 属性,它不提供 类似于arguments.callee 提供的功能。确保 在使用 ... (休息)之前,您不需要使用 arguments.callee 参数。

    取出...rest参数,出现arguments对象。

    此外,this 关键字并非总是必需的。

    method.apply(this, args);
    

    可能会在静态函数中引发错误,但参数是可选的,因此这也有效:

    method.apply(null, args);
    

    更多关于rest 关键字的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多