javascript中嵌套的匿名函数中的变量
Variables inside nested anonymous functions in javascript
有人能解释一下吗?
- 为什么警报2在警告1之前弹出
- 为什么警报1中pageCount的值与报警2不同
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 }
alert1在回调中——只有当ajax请求成功完成(即异步)时,才会调用此函数。
pageCount不同的原因相同-调用alert2时没有进行成功回调。
正如大多数答案所提到的,您进行异步调用,但这并不是真正的原因。所以JavaScript是单线程的,每次只能进行一次思考。
因此,首先调用您的函数,该函数将被放入执行上下文堆栈中。此函数将在执行将添加到堆栈中的任何其他函数之前执行。在这个函数中,您进行ajax调用,成功后,success函数将被放在执行上下文堆栈中。因此,这个函数在naviSet
之前永远不会被调用。由于alert1是在naviSet
函数中生成的,它将首先被调用。
关于你的第二个问题:
根据您的函数,我想您相信,当$.ajax()
返回true
时,您的ajax调用成功,pageCount
被设置为data。但事实并非如此。$.ajax
不返回true,而是返回true值$
。它是一个返回对主jquery对象的引用的函数,因此您可以链接函数调用。
函数naviSet()
{
//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
}
为什么警报2在警报1之前弹出?
当收到成功的HTTP响应时,回调函数会触发警报1。
一旦发送了HTTP请求,就会触发警报2。
网络速度较慢。
为什么警报1中pageCount的值与警报2不同?
因为它是在收到响应时(就在收到警报之前)通过上面提到的相同回调函数更改的。
因此,首先调用第二个警报。正如我所说,在ajax函数工作的同时,代码的其余部分继续执行。
第二个警报首先发生的原因是ajax
调用是异步的。它基本上安排了一个网络调用并立即返回。因此,它后面的行是第二个警报,直接发生在它之后。
稍后的某个时间点,web请求将完成并调用success
函数。因此,第一个警报发生在
- 访问嵌套函数结构中的JavaScript父函数变量
- Javascript函数变量传递语法问题
- JavaScript 函数变量范围问题
- 在 promise 中获取构造函数变量
- 将函数结果传递给Javascript中的另一个函数变量
- 用对象设置函数变量's值
- Javascript函数变量应生成错误,而不是未定义的错误
- 我可以访问用户脚本中的匿名函数变量吗?
- 在实例化期间使用构造函数变量
- 为什么在 JavaScript 中不能用函数变量覆盖字符串变量
- JavaScript 允许调用函数访问调用函数变量
- 如何在嵌套原型中访问 JavaScript 构造函数变量
- 对函数变量的 JavaScript 控制台日志输出感到困惑
- 如何将函数变量传递给主干模型上的 jQuery 事件
- 如何访问构造函数变量
- 实例函数变量不会更改
- 为什么函数变量在变量之后是未定义的
- 用内部函数变量更改外部函数变量?Javascript
- Javascript - 使用闭包递增静态函数变量模拟
- 异步 JavaScript 静态函数变量