gpt4 book ai didi

flash - ActionScript 3 'this' 问题

转载 作者:行者123 更新时间:2023-12-05 01:12:16 25 4
gpt4 key购买 nike

有人能指出为什么下面的代码在第一种情况下会失败吗:

案例 1

// In a constructor
this.gallery = new Gallery();
addChild(this.gallery);

this.gallery.addEventListener(GalleryEvent.WHATEVER, function(event:*) {
// When this callback fires, there is a fail:
// because there is no 'this.gallery'.
this.gallery.someAction();
});

案例 2

this.gallery.addEventListener(GalleryEvent.WHATEVER, function(event:*) {
// This works fine
gallery.someAction();
})

在这种情况下是否有关于用法的任何规则?

最佳答案

这是因为“作用域链”。在 ActionScript 3(符合 ECMAScript——JavaScript 具有下面描述的相同行为)中,有一个内置的“位置”列表,用于解析任何命名变量,称为作用域链。例如。当在类的“普通”方法中时,作用域链如下所示:

  • 当前实例对象(同this)
  • 类对象(用于访问静态变量)
  • 全局范围(用于访问全局变量,例如 Math)

但是当你在一个匿名内部函数中时,作用域链在顶部多了一个条目,代表在匿名函数被创建时在作用域中的方法.例如,假设您有以下代码:

class C {
var membervar:int;

function f() {
var localvar:int;

var innerfunc:Function = function() {
// what is on the scopechain here?
};

innerfunc();
}
}

在这种情况下,当您在“这里的作用域链上有什么”这一行时,作用域链看起来像这样(下面的第一个作用域是第一个要检查的地方):

  • 函数 f() 的一个实例,带有变量 localvarinnerfunc
  • C类的当前实例
  • C
  • 全局范围

重要的是要认识到,当代码行 var innerfunc:Function = function()... 执行时,它正在动态创建 Function 对象,并将其作用域链设置为苍蝇。因此,例如,假设您有这段(令人困惑的)代码,给定一个参数 an_arg,它返回一个函数,该函数在被调用时将打印 an_arg 的值:

function f(an_arg:int):Function {
return function():void {
trace(an_arg);
}
}

调用 f() 返回的每个函数都有自己的作用域链,指向 f() 的不同实例。所以:

var func1:Function = f(3);
var func2:Function = f(4);

func1(); // prints 3
func2(); // prints 4

避免这个问题的常用方法,如果你真的想在内部函数中引用 this 而不是依赖作用域链的魔法,是创建一个名为 self 在外部函数中——对于您的示例代码,它看起来像这样:

var self = this;
this.gallery.addEventListener(GalleryEvent.WHATEVER, function(event:*) {
// This works fine
self.gallery.someAction();
})

我可以一直讨论这个主题——我发现它很吸引人 :-)

关于flash - ActionScript 3 'this' 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4730664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com