javascript中嵌套匿名函数中的变量
谁能解释一下吗javascript中嵌套匿名函数中的变量,javascript,Javascript,谁能解释一下吗 为什么警报2在警报1之前弹出 为什么警报1中的页面计数的值与警报2不同 为什么警报1之前会出现警报2 警报1由回调函数触发,该函数在收到成功的HTTP响应时触发 HTTP请求发送后立即触发警报2 网络很慢 为什么警报1中的pageCount值不同于警报2 因为它是在收到响应时(就在发出警报之前)由上述相同的回调函数更改的。警报1位于回调中-只有在ajax请求成功完成时(即异步)才会调用此函数 页面计数不同的原因相同-调用alert2时未进行成功回调。ajax函数从给定url异步检
因为它是在收到响应时(就在发出警报之前)由上述相同的回调函数更改的。警报1位于回调中-只有在ajax请求成功完成时(即异步)才会调用此函数
页面计数不同的原因相同-调用alert2时未进行成功回调。ajax函数从给定url异步检索数据。这意味着它是在后台执行的,而其余的代码则在执行。一旦完成,将调用分配给“成功”的函数(如果失败,则调用“错误”)
因此,第二个警报称为第一个警报。正如我所说,当ajax函数工作时,其余代码继续执行。第二个警报首先出现的原因是
ajax
调用是异步的。它本质上是安排一个web调用并立即返回。因此,它之后的第二个警报行直接发生在它之后
稍后,web请求将完成并调用
success
函数。因此,第一个警报发生在该点,因为大多数答案都提到您进行了异步调用,但这并不是真正的原因。所以JavaScript是单线程的,每次只能进行一次思考
因此,首先调用函数,该函数将放在执行上下文堆栈上。此函数将在添加到堆栈的任何其他函数可以执行之前执行。在这个函数中,您进行ajax调用,一旦成功,success函数将被放在执行上下文堆栈上。因此,以前从未调用过此函数naviSet
。由于alert1是在naviSet
函数中生成的,因此它将首先被调用
关于你的第二个问题:
从您的函数来看,我认为您相信,当$.ajax()
返回true
时,您的ajax调用是成功的,pageCount
被设置为data。但事实并非如此<代码>$。ajax不返回true,而是返回truethy值$
。它是一个函数,它返回对主jquery对象的引用,这样您就可以链接函数调用
函数naviSet()
它与慢速网络无关,而是与JavaScript的单线程特性有关。网络时间为零的事件在alert2之前无法调用它。因为它的asnc调用kaleem:)
function naviSet()
{
var pageCount;
if($.ajax({
type: "POST",
url: "http://localhost/mywebsite/wp-content/themes/twentyeleven/more-projects.php",
success:function(data)
{
pageCount = data;
alert(pageCount); //alert 1
return true;
},
error:function()
{
$("#direction").html("Unable to load projects").show();
return false;
}
})) alert(pageCount); //alert 2
}
{
//you create a new var which is undefined
var pageCount;
// return $ which is a truethy in JavaScript, but it does not mean the ajax call was successful
if($.ajax({
type: "POST",
url: "http://localhost/mywebsite/wp-content/themes/twentyeleven/more-projects.php",
success:function(data)
{
// now you in the context of your success function
// and set the value of your variable to data
pageCount = data;
alert(pageCount); //alert 1
return true;
},
error:function()
{
$("#direction").html("Unable to load projects").show();
return false;
}
}))
//here you are still in the context of your naviSet function where pageCount is undefined
alert(pageCount); //alert 2
}