我有以下jQuery函数:
function deleteHype(){
FB.api('/me/launchhype:hype', function(response) {
$.each(response.data, function(i, obj){
if (obj.data.launch.url == '<?php the_permalink(); ?>') {
var delete_launch_id = parentObj=obj.id;
}
});
});
}
alert(delete_launch_id);
让我们在IF语句中说var“delete_launch_id”是“X”。好吧,如果我尝试在函数外部执行警告“delete_launch_id”,它将是“未定义”。我希望它能给我回“X”(假设的价值)。
我该怎么做?我迷路了,似乎找不到类似的例子。
答案 0 :(得分:1)
根据大众需求,这里更深入地了解为什么变量“delete_launch_id”在“警报”功能访问时无法使用。
有几件事正在发生。
首先,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 treats就像一个变量(因为它是),并且可以调用它,因为它是一个函数,它内部的代码将在调用时执行。这是一个非常方便的模式。
我希望有所帮助。起初这是令人困惑的事情。
答案 1 :(得分:0)
将变量声明为全局变量(或者在任何需要的地方都可以访问命名空间)。
问题是,一旦你这样做,你需要担心它何时被访问,以及当时访问它是否合理。更好的解决方案取决于您实际要做的事情。
但是,一般情况下,最好将这种异步内容保持为本地,并使用函数来操作回调中的状态。例如,您可以将函数传递给使用ID执行“正确”操作的deleteHype
,在回调中执行工作,从回调或传递给它的函数操作DOM等等。
答案 2 :(得分:0)
我不会理解为什么你不能在代码中“看到”delete_launch_id的所有原因,但也许这样的东西会起作用?:
function deleteHype(callback){
FB.api('/me/launchhype:hype', function(response) {
$.each(response.data, function(i, obj){
if (obj.data.launch.url == '<?php the_permalink(); ?>') {
if(typeof callback === 'function') {
callback(obj.id);
}
}
});
});
}
deleteHype(function(delete_launch_id) {
alert(delete_launch_id);
});
答案 3 :(得分:0)
您需要做的是将变量作为两个函数之间的参数传递。
function deleteHype(){
FB.api('/me/launchhype:hype', function(response) {
$.each(response.data, function(i, obj){
if (obj.data.launch.url == '<?php the_permalink(); ?>') {
var delete_launch_id = parentObj=obj.id;
}
});
});
}
function grabID(delete_launch_id){
alert(delete_launch_id);
}
你的第一个功能是完全正确的。现在你只需要第二个函数来获取参数并输出它;如下。
function grabID(delete_launch_id){
alert(delete_launch_id);
}
现在您可以在需要输出delete_launch_id的地方使用grabId。