Javascript 如何缓存/预计算某些内容(没有全局变量)?

Javascript 如何缓存/预计算某些内容(没有全局变量)?,javascript,Javascript,我想做的是在两个处理程序之间发送数据 element.onmousedown = function() { data = precalculate(); } element.onmouseup = function() { dosomething(data); } 如果数据是一个全局变量,则该变量有效。人们说全局变量是邪恶的。但是我不知道没有它怎么办 或者我误解了“全局变量”?在这种情况下,全局变量是有意义的。另一种可能是将值附加到DOM元素: element.onmouse

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

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

element.onmouseup = function() {
    dosomething(data);
}
如果
数据
是一个全局变量,则该变量有效。人们说全局变量是邪恶的。但是我不知道没有它怎么办


或者我误解了“全局变量”?

在这种情况下,全局变量是有意义的。另一种可能是将值附加到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);
};
您误解了“全局变量是邪恶的”

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


好吧,我的朋友,它们在这里很合适。

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


如果不想/不需要变量是全局变量,只需对其进行范围限定即可:

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

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

编辑:澄清一下,在javascript中创建新变量作用域的唯一方法是在函数中

在函数内部使用
var
声明的任何变量对外部作用域都是不可访问的

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

由于处理程序是在可以访问
数据
变量的范围内创建的,因此它们保留对该变量的访问权限

再举一个例子:

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'

只要将全局变量保持在最小值,就可以使用全局变量,例如,可以将内容放在单个全局命名空间中:

App = {};

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

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

另一个更通用的解决方案是使用一种称为记忆的技术创建缓存结果的函数。如果你搜索的话,有很多东西。 下面的代码正是这样做的:

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的新函数,该函数缓存原始函数的结果,以便在第一次执行实际代码时以及从本地缓存检索所有后续调用

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

更多信息:

这里没有使用jQuery的迹象。@用户:只是为了一个简单的需要而加载整个库是没有意义的,而这个需要在语言本身中很容易解决。我认为这是一个正确的观点。如果解决方案不好,不要投赞成票。但是用户没有明确表示不同意jquery。@用户:是的,我没有投赞成票或反对票。只是觉得值得一提。jQuery可能是一个很好的解决方案,但并不总是如此。同意,并且记录在案,我投票支持你的解决方案,如果我知道了,我会提供它,但我会坚持我所知道的,直到我知道的更好。所有笼统的概括都是邪恶的;o) @Lai:很高兴我能帮忙。我添加了另一个变量范围示例。