gpt4 book ai didi

javascript - Titanium JavaScript 事件处理程序和类作用域

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:25:08 24 4
gpt4 key购买 nike

在 Titanium 下开发 我在 OOP JavaScript 和事件处理程序范围内遇到过这种奇怪的行为。这是我的代码:

MyClass = function()
{
this.var1 = '50';
this.button = Ti.UI.createButton({
...
});
this.button.parentRef = this;
this.button.addEventListener('click', function(e){
var self = e.source.parentRef;
console.log(self.var1);
console.log(self.var2);
});

this.var2 = 'Test';
...
/* this.button is then added to a view */
};
...
var c = new MyClass();
...

当我点击按钮时,我希望在我的控制台中找到:

50
Test

但实际上结果是:

50
<null>

如果我移 Action 业

this.var2 = 'Test'

之前

this.button.addEventListener

语句,结果为:

50
Test

听起来 this.button.parentRef = 这个赋值是通过复制而不是通过引用...

这种行为的原因是什么?

最佳答案

你是对的。

您所做的事情与 Titanium 有冲突,每当您向 Titanium native 对象添加属性时,它都是按值传递的,因为底层对象(您的 View )实际上是 native 映射到 JavaScript 对象。因此,发生的情况是该对象的当前值(在您的例子中为 this)通过 Javascript-to-native 桥发送并设置为 native 对象的属性(或类似的东西)。

归根结底,您设置的 native 对象上的任何属性几乎都被该对象克隆,这就是您看到上述功能的原因。

那么有什么方法可以解决这个问题呢?

这是简单的方法:

var self = this;
this.button.addEventListener('click', function(e){
console.log(self.var1);
console.log(self.var2);
});

它在某种程度上污染了您的按钮监听器范围,但至少它不在全局范围内。

关于javascript - Titanium JavaScript 事件处理程序和类作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19030037/

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