如何缓存/预先计算某些东西(没有全局变量)?

时间:2011-06-13 19:12:40

标签: javascript

我想要做的是在两个处理程序之间发送数据。

element.onmousedown = function() {
    data = precalculate();
}

element.onmouseup = function() {
    dosomething(data);
}

如果data是一个全局变量,它就可以工作。人们说全球变量是邪恶的。但我不知道如果没有它。

还是我误解了“全局变量”?

6 个答案:

答案 0 :(得分:5)

如果你不想要/需要变量是全局变量,只需调整范围:

(function() {
    var data;
    element.onmousedown = function() {
        data = precalculate();
    }

    element.onmouseup = function() {
        dosomething(data);
    }
})();

编辑:为了澄清,在javascript中创建新变量范围的唯一方法是在函数中。

在函数内部用var声明的任何变量都是外部作用域无法访问的。

在上面的代码中,我创建了一个IIFE (立即调用的函数表达式),它只是一个创建后立即调用的函数,我放置了data内部的变量(以及处理程序分配)。

由于处理程序是在可以访问data变量的作用域中创建的,因此它们保留对该变量的访问权限。

举另一个例子:

var a = "a"; // global variable

(function() {

    var b = "b";  // new variable in this scope

    (function() {

        var c = "c";  // new variable in this scope

        // in this function, you have access to 'a', 'b' and 'c'

    })();

    // in this function you have access to 'a' and 'b' variables, but not 'c'

})();

// globally, you have access to the 'a' variable, but not 'b' or 'c'

答案 1 :(得分:3)

在这种情况下,全局变量是有意义的。另一种可能性是将值附加到DOM元素:

element.onmousedown = function() {
    // 'this' should point to the element being mouse downed
    this.data = precalculate(); 
};

element.onmouseup = function() {
    // 'this' should point to the element being mouse upped
    var data = this.data;
    dosomething(data);
};

答案 2 :(得分:0)

你误解了“全局变量是邪恶的”。

事实上,真正发生的事情是有人想成为“人群的一部分”,因此告诉你一个全面的概括,实际上他们应该说“只在适当时使用全局变量”。

嗯,他们在这里很合适,我的朋友。

答案 3 :(得分:0)

JQuery通过使用.data()函数实现了这一点:

http://api.jquery.com/jQuery.data/

答案 4 :(得分:0)

只要将它们保持在最低限度,您就可以使用全局变量,例如,您可以将东西放在一个全局命名空间中:

App = {};

element.onmousedown = function() {
   App.data = "hello";
}

element.onmouseup = function() {
   console.log(App.data);
}

答案 5 :(得分:0)

另一个更通用的解决方案是创建使用称为memoization的技术缓存其结果的函数。如果你搜索,有很多东西。 以下代码正是如此:

Function.prototype.memoize = function() {
    var fn = this;
    this.memory = {};
    return function() {
        var args = Array.prototype.slice.call(arguments);
        return fn.memory[args] ? fn.memory[args] : fn.memory[args] = fn.apply(this, arguments);
    };
};

e.g。你有一个叫做exfunc的昂贵的函数。

newFunc = exfunc.memoize();

上面的语句创建了一个名为newFunc的新函数,它缓存原始函数的结果,以便第一次执行实际代码并从本地缓存中检索所有后续调用。

这主要适用于其返回值不依赖于全局状态的函数。

更多信息: http://osteele.com/archives/2006/04/javascript-memoization