我正在编写Webkit Storage API的基本包装器(this API的新版本)供我使用。我目前的问题是queryUsageAndQuota()
函数。
我对这个特定函数的封装最初看起来像这样:
self.pers.getQuota = function() {
self.pers.queryUsageAndQuota(function(usage,quota) {
return quota;
});
}
// self is a reference to the top level of this 'wrapper'
因此,我会调用var quota = self.pers.getQuota();
并返回配额。
在失败之后,我看了this question并更改了它,所以我使用了用户定义的回调。现在功能如下:
self.pers.getQuota = function(callback) {
self.pers.queryUsageAndQuota(function(usage,quota) {
callback.call(quota);
});
}
然而,执行此行:
self.pers.getQuota(function(quota) {
console.log(quota);
});
在日志中显示undefined
。我无法弄清楚为什么,因为当我执行基础函数navigator.webkitPersistentStorage.queryUsageAndQuota()
时,我得到了正确的数字。
答案 0 :(得分:3)
.call
并不像你认为的那样工作。取而代之的是callback.call(null, quota)
。
Function.prototype.call
(以及apply
的类似情况)的实际签名是
Function.prototype.call(valueOfThis, valueOfParam1, valueOfParam2, ...);
这也是为什么我经常说javascript中的this
关键字是愚蠢的,你应该避免使用它。它只是像所有其他参数一样的另一个参数,你只是没有为它指定一个名称。当Netscape强制要求这种基于Scheme的语言看起来像Java时,这是javascript创建的遗迹。
顺便说一下,你可以在这里使用第三种调用方法的方法。简单地
callback(quota);
然而,这会产生副作用,即让javascript猜测你想要的this
(在这种情况下为全局window
对象)。只要您不使用this
,简单的语法就会很有用。
如果你真的真的想要返回一个值,而不是将回调外观传递给javascript promises。我不能告诉你使用哪一个,而不知道你在哪个环境以及你正在使用的库jQuery has a good implementation in the Deferred object
答案 1 :(得分:1)
尝试
self.pers.getQuota = function(callback) {
self.pers.queryUsageAndQuota(function(usage,quota) {
callback(quota);
});
}
或
self.pers.getQuota = function(callback) {
self.pers.queryUsageAndQuota(function(usage,quota) {
callback.call(/* an object as 'this'*/, quota);
});
}
或强>
self.pers.getQuota = function(callback) {
self.pers.queryUsageAndQuota(function(usage,quota) {
callback.apply(/* an object as 'this'*/, [quota]);
});
}