JavaScript中全局变量photo_data重新赋值不生效的原因是什么?
问题原因
你的问题本质是异步代码执行顺序导致的,和全局变量的赋值规则无关:$.post是jQuery的AJAX异步请求方法,发出请求后不会等待服务端返回结果,会直接继续执行后面的同步代码,等服务端响应返回后才会执行.always()绑定的回调函数。
对应到你的代码执行顺序是:
- 触发
cloudinarydone事件,代码执行到$.post行,向服务端发送请求,.always()回调被暂时挂起 - 主线程直接向后执行,运行
console.log('photo_data', photo_data),此时回调还没触发,photo_data还是初始值none,所以你会觉得赋值没有生效 - 等服务端响应返回后,才会执行
.always()里的逻辑,这时候才会给全局变量photo_data赋值为view_content
修复方案
所有需要用到赋值后photo_data,或者依赖$.post返回结果的逻辑,都必须放到.always()回调内部执行,或者封装成独立函数在回调内部调用。
示例调整:
$.post(this.form.action, $(this.form).serialize()).always(function (view_content, status, jqxhr) { $('.status_value').text(view_content.errors ? JSON.stringify(view_content.errors) : status); console.log('view_content', view_content); // 全局变量赋值在这里执行 photo_data = 'view_content'; // 需要用到photo_data的逻辑都放在这里 console.log('photo_data', photo_data); $(info).append($('<div class="div_photo_details"/>') .append(formatContent(view_content))); });
内容的提问来源于stack exchange,提问作者curtisp
相关产品推荐
相关产品推荐

