在函数外的函数内更新变量?

时间:2012-10-24 02:00:48

标签: javascript cordova

我正在使用PhoneGap LocalNotification插件,它允许我在特定时间设置本地通知。

LocalNotification插件的基本结构如下:

var notification = {
    init: function () {

    },
    clear_all: function () {
        notification.clear();
        plugins.localNotification.add({
            badge: 0,
        });

    },
    alert_ten: function () {
        var d = new Date();
        d = d.getTime() + 10 * 1000; //60 seconds from now
        d = new Date(d);
        plugins.localNotification.add({
            date: d,
            repeat: 'daily',
            message: varone + ' - ' + vartwo + '!',
            hasAction: true,
            badge: 1,
            id: '1',
            sound: 'horn.caf',
            background: 'app.background',
            foreground: 'app.running'
        });
    },
}

如果您查看通知的消息部分,它将包含以下varone + ' - ' + vartwo + '!'。在页面加载时,varonevartwo将从localStorage项填充。然后我打电话给notification.alert_ten() onLoad。

一切正常,但有一个例外:

当用户与某个div进行交互,即点击它时,会设置localStorage个项目。然后,当加载应用程序时,它会检查以查看这些值,并在10秒后提醒消息,说thisthat,它们从LS获取它们的值。

如果用户改变主意,并与更改LS项目的其他div进行交互,则LocalNotification仍然使用原始LS项目集运行。

这是可以预期的,因为JS会将变量缓存在函数中。我认为可行的解决方案是全局定义变量,高于var notification = {,然后当用户与div交互时,更新变量以表示新变量。

全局变量:

var varone = localStorage.getItem("favorite");
var vartwo = localStorage.getItem("favorite-status").substr(2).toLowerCase();
...

更新了变量:

...
var varone = text;
var vartwo = favstatus;
...

函数notification.alert_ten()仍然使用全局变量中定义的原始值运行,而不是更新的。

1 个答案:

答案 0 :(得分:1)

您可以编写getter / setter函数。这只是一个概念证明,你可以添加你喜欢的任何方法。只需确保在要在对象内部的函数之间共享的任何属性之前添加this.,或者要从对象外部访问。

var notification = {
  setX : function (newX) {
    this.x = newX;
  },
  getX : function () {
    return this.x;
  },
  outputX : function () {
    document.write('x is ' + this.x + '<br>');
  }
}

初始化并使用:

notification.setX(42);
console.log(notification.getX());

notification[x] = 42;
console.log(notification[x]);

甚至

notification.x = 42;
console.log(notification.x);

DEMO

所以你的代码可能就像(除了有趣的部分之外的所有部分)

var notification = {
    getMessage: function() {
        return this.message;
    },
    setMessage: function() {
        this.message = localStorage.getItem("favorite") + ' - ' + 
                       localStorage.getItem("favorite-status").substr(2).toLowerCase() + '!';
    },
    alert_ten: function () {
        plugins.localNotification.add({
            message: this.getMessage()
        });
    }
}

// After some event I guess
notification.setMessage();
// After some other event?
notification.alert_ten();