我们知道,如果我们多次调用一个函数,则变量不会相互冲突,因为它们具有不同的作用域,例如。 new_var
在函数any_function
的两次调用中都不同
function any_function(argument1){
new_var = argument1;
alert(new_var);
}
any_function("hello i am first");
any_function("hello i am second");
但是我有一个执行ajax调用的函数,当我多次调用此函数时,变量new_var
会根据上一次调用(调用)进行修改,并且对于所有函数do_ajax()
function do_ajax(argument1){
// var new_var = argument1;
new_var = argument1;
$.ajax({
url : window.location.href,
success: function(r){
alert(new_var);
}
});
}
do_ajax("first ajax done");
do_ajax("second ajax done");
您可以在这里https://codepen.io/nikhilnagpal123/pen/XPrvxa
查看结果另一个有趣的事情是,如果我将var
放在变量new_var
之前,那么我会得到预期的结果
https://codepen.io/nikhilnagpal123/pen/oPNvXJ
据此,我可以猜测到变量是如何被修改的,但是对该函数的另一次调用又如何修改该变量,但不应有冲突,它们应该具有不同的作用域,
有人可以解释吗?
对不起,上面的问题有点愚蠢,基本上,当我们在没有var
的函数中声明变量时,我们给该函数一个全局范围,并且该变量可以被全局访问
例如。
function any_function(argument1){
new_var = "hello";
}
any_function("hello");
alert(new_var); //global variable, also can be accessed by window.new_var
但是如果我在声明变量时使用var
,它将仅具有局部作用域
function any_function(argument1){
var new_var = "hello";
}
any_function("hello");
alert(new_var); // can not be accessed globaly `new_var` scope was only limited to function `any_function` where it was decalred
因此,在上述问题中,当我在声明它们时不使用var
时,最后一个ajax调用会修改全局变量,
我有一个错误的想法,那就是当我们不在函数外部声明变量时,它始终在函数内部具有局部范围,在此声明是否使用var
都无关紧要还是没有造成整个误解,
感谢用户@Alex和@mplungjan为我弄清楚了。
谢谢!