JavaScript变量范围
我在函数中声明了var1。然而,当我尝试在内部函数2中赋值时,似乎另一个var1是create,而不是引用第一个var1JavaScript变量范围,javascript,extjs,closures,scope,Javascript,Extjs,Closures,Scope,我在函数中声明了var1。然而,当我尝试在内部函数2中赋值时,似乎另一个var1是create,而不是引用第一个var1 var func1 = function(response) { var var1; function inner_function2(param) { Ext.Ajax.request({ url:'', params: param, success:functio
var func1 = function(response) {
var var1;
function inner_function2(param) {
Ext.Ajax.request({
url:'',
params: param,
success:function(result, request) {
var1 = a;
}
});
}
}()
我建议您在代码中明确指定范围。你可以这样做:
var func1 = function(response) {
var var1;
var outer_scope = this;
function inner_func2(param) {
Ext.Ajax.request({
url: '',
params: param,
scope: outer_scope,
success: function(result, request) {
var1 = a;
}
});
}
}()
希望它能起作用
success
在返回Ajax请求后调用Ext.Ajax.request
的回调。这意味着调用它的函数(包括func1()
和internal\u function2()
都已返回,其作用域已被删除
让我们试着展示一系列事件
func1()
var1
已声明internal\u function2()
被调用(我假设您确实在某处调用了它)Ext.Ajax.request()
,并声明success
回调内部函数2()
结束-AJAX请求正在后台运行func1()
结束,局部变量var1
被删除(尽管它仍在回调范围内可用)-AJAX请求在后台运行success
调用回调。由于没有局部变量var1
将创建一个全局变量,并将其赋值为a
(请参见下面的注释,说明删除此变量的原因).Local变量var1
在回调的作用域中仍然可用,但一旦回调结束,该变量在任何地方都不再可用,因此您无法使用它记住AJAX中的“A”代表“异步”。如果复制+粘贴出现问题,我认为语法无效?另外,您如何确定“似乎创建了另一个var”?这是ExtJS特有的吗?如果是的话,我会感到惊讶,因为通常闭包会覆盖这一点。是的,
success
回调在internal_function2
返回很久之后才被调用,但是闭包应该在回调中保持var1
活动。@deceze:如果赋值是a=var1
那么是。但是因为它是另一种方式,所以它不是。得了吧。如果这个变量在任何地方都不再可用,你会如何使用它?@CKeven:因为异步调用就是这样工作的。func1()不会等待AJAX请求完成。它只是启动它,然后继续它的工作。胡说,封闭变量是封闭变量,无论它位于赋值的哪一侧。我同意,真正的问题是变量没有在正确的范围/时间内访问,但赋值确实分配给var var1代码>。解决方案是在func1函数声明之外创建var1(或者跳过var var1
中的var,然后全局创建它,但这不是一个很好或可读的解决方案)。