根据大众的需求,这里更深入地了解为什么变量“delete_launch_id”在“alert”函数访问时不可用。
有几件事正在发生。
首先,FB.api 函数很可能是一个异步 AJAX 调用。 JavaScript 还不是真正的异步(目前),但在这种情况下,它实际上表现得如此。这意味着当异步代码执行时,它之后的代码将继续执行,同时异步代码等待响应。因此,如果您调用“deleteHype”,然后在其后立即调用“alert”,则很有可能在调用“alert”时 FB.api 响应不会返回。因此,该异步代码中设置的任何内容都将不可用。
第二个问题是 JavaScript 具有“功能范围”。实际上,这意味着在函数内部定义的变量仅在该函数内部可用。它仅在该功能内具有“范围”。考虑以下代码:
var foo = 1;
if(1 === 1) {
// non-function block. foo is accessible in here, and any changes to foo will be seen outside this block.
foo = 2;
}
// foo is 2
function change() {
// functional scope. variables defined in here are only available here
foo = 3;
var bar = 1;
}
// foo is 2 because we haven't called change yet
// bar is "undefined"
change();
// foo is 3
// bar is "undefined"
"foo" 发生了变化,因为它的作用域在函数之外,所以函数可以访问它。
但是,“bar”仅在该函数内部具有作用域,在其他任何地方都不存在。
在原始示例中,“delete_launch_id”实际上是在几个函数中声明的,因此在其他任何地方都不可用。
我的第一个答案通过将一个函数作为“回调”传递给“deleteType”函数来解决这些问题,只有在异步代码完成并返回时才会调用该函数。处理问题#1。然后,回调函数将“delete_launch_id”传递给它,使其可用。我给出的格式可能有点奇怪:
deleteHype(function(delete_launch_id) {
// alert
});
这里发生的事情是我们实际上将函数作为变量传递。这是一个“匿名”函数(没有名字)。所以deleteType对待就像一个变量(因为它是),并且可以调用它,因为它是一个函数,并且它里面的代码会在它被调用时执行。这是一个非常方便的模式。
我希望这会有所帮助。起初这很令人困惑。