我会承认的。回调的想法对我来说没有任何意义。我正在尝试为我的程序实现一个,因为我的变量在函数内部修改后保持不变。
function getMessage(callback) {
setTimeout(function() {callback(setupAddress(ownerPickupAddressItem));
}, 0);
}
getMessage(function(ownerPickupAddressItem) {
console.log(ownerPickupAddressItem);
});
function setupAddress(ownerPickupAddressItem) {
ownerPickupAddressItem = $('.timeline-item.active-item > .timeline-status > .pickup-address').text();
}
我已对上述内容进行了测试,ownerPickupAddressItem
仍为undefined
。知道为什么吗?
答案 0 :(得分:2)
undefined
,因为您将setupAddress
的结果传递给了回调。 setupAddress
不会返回任何内容,因此它是undefined
。而是从setupAddress
:
function getMessage(callback) {
setTimeout(function() {callback(setupAddress(ownerPickupAddressItem));
}, 0);
}
getMessage(function(ownerPickupAddressItem) {
console.log(ownerPickupAddressItem);
});
function setupAddress(ownerPickupAddressItem, ownerDropoffAddressItem, waypointsArrayItem) {
return $('.timeline-item.active-item > .timeline-status > .pickup-address').text();
}
但请注意,您实际上并没有以有意义的方式将任何参数传递给setupAddress
函数 - 它们都是undefined
。
让我们简化一点:
//Fire the callback after 1 second with some text
function getMessage(callback) {
setTimeout(function() {
callback("Hello world!");
}, 1000);
}
getMessage(function(message) {
console.log(message);
});
这会调用getMessage
并使用一个旨在获取单个参数的回调。 getMessage
函数等待1秒,然后触发回调。
答案 1 :(得分:0)
您可能想要做这样的事情
var self = this;
function getMessage(callback) {
/*
assuming you have
ownerPickupAddressItem, ownerDropoffAddressItem, waypointsArrayItem
defined somewhere on self
*/
setTimeout(function() {
callback.call( self, self.ownerPickupAddressItem,
self.ownerDropoffAddressItem,
self.waypointsArrayItem );
}, 0);
}
基本上会传递函数,当调用回调时会使用当时的args
您未定义的原因是因为
function getMessage(callback) {
setTimeout(function() {
//you are calling setupAddress and passing it to the callback
//setupAddress returns nothing, so it will be undefined
callback(setupAddress(ownerPickupAddressItem));
}, 0);
}
另请查看 mozilla docs for call 和 apply ,了解如何设置回调的执行上下文