举个栗子:
window.onload=function(){
var a=1;
var b=2;
plus(a,b);
function plus(a,b){
a=a+b;
b=0;
//此时在这个函数内还能调用到父函数中的a=1,b=2吗?
}
}
这个问题是两种不同变量在作为参数传递的问题,JS传递变量分为两种一种是基础变量,传递的是变量内容,第二种是引用变量(对象),在函数中传递的指向对象的指针,楼主这个函数传递的是基础变量,所以在子作用域中修改了变量,在父作用域中变量并没有修改,但是你如果将a、b封装在对象中,将对象作为函数参数传递过去,就可以修改父函数的内容了。如下代码所示。
window.onload=function(){
var a=1;
var b=2;
plus(a,b);
function plus(a,b){
a=a+b;// 等同于 var a = a+b;此处的a是子作用域新定义的a,那么子作用域就有两个名为a的基本变量,按js规则,后面定义的基本变量会覆盖前者
b=0;//同上
}
}
修改代码如下:
window.onload=function(){
var obj = {};
obj.a = 1;
obj.b = 2;
alert(obj.a);
alert(obj.b);
plus(obj);
function plus(obj){
a = obj.a+obj.b;
b = 0;
alert("innerA:"+obj.a);
alert("innerB:"+obj.b);
}
alert("outterA:"+obj.a);
alert("outterB:"+obj.b);
}
可以,这个叫闭包(closure)内侧的函数可以访问外面的自由变量,反过来不行。
可以,这是js中高级知识的闭包,可以调用上级作用域,
可以,但是a b值已经改变了
明确告诉你调用不到,而且这个代码断也并没有涉及到闭包。在plus函数中a b两个变量均为私有变量,而不是onload函数中的a b变量,且js函数参数都是按值传递的,所以onload函数中的a b并没有发生改变