我的问题有点奇怪,我有以下示例代码:
window.test = function (number) {
$.ajax({
url: "/test",
success: function () {
// console.log(number);
console.log("test");
},
error: function () {
// console.log(number);
console.log("test");
}
});
};
test(5);
我真的不在乎AJAX调用是否成功/错误,但是我使用开发工具在每个console.log语句中放置一个断点,然后使用开发工具我尝试通过悬停它或直接输入" number"来检查数字的值。进入控制台。
在所有情况下,我得到"未定义"
但是,如果我删除了注释行,则会打印ofc 5,当我停在断点处时,#34; number"已定义且具有正确的值。
问题是..为什么?
据我所知,每个函数都应该可以访问其父作用域变量,因此成功/错误函数应该可以访问数字。
我最好的猜测是,因为一个AJAX调用被触发,当浏览器进入回调"数字"可能是由浏览器GC收集的。
答案 0 :(得分:1)
当您从回调函数中注释掉使用number
的语句时,这些函数中不再使用该变量。
success
和error
函数不会关闭number
,因为它们不会尝试访问它(并且JavaScript编译器可以检测到它)。
因此,当test
函数完成时,number
变量被标记为垃圾回收,而不能用于success
和error
(不需要它) 。这在success
或error
运行之前发生(并且您在调试器中测试number
的值)。