理解一:
1、执行以下代码,控制台输出"red"。
主程序调用函数changeColor(),swapColors()函数运行:在使用变量color时,首先找函数内部有无color变量,没有就往上找,最后找到全局变量color,tempColor把值“red”赋值给color,此时全局变量的值变为“red”。
var color = "blue";
function changeColor(){
var anotherColor = "red";
function swapColors(){
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
}
swapColors();
}
changeColor();
console.log(color);
2、执行以下代码,先弹出一个“red”的弹窗,接着控制台输出"blue"。
给予函数一个局部变量color,则执行函数时,就会使用局部变量color,不会影响全局变量的值(如在函数外调用局部变量anotherColor,控制台会显示“anotherColor is not defined”)
var color = "blue";
function changeColor(){
var anotherColor = "red";
function swapColors(){
var color = "yellow";
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
alert(color);
}
swapColors();
}
changeColor();
console.log(color);
console.log(anotherColor);
3、执行此代码,无输出。
将swapColors()代码注释后,因为swapColors()在函数changeColor()的可执行代码中,并没有被调用执行,因此执行changeColor()时,swapColors()不会创建新的上下文,就不会被执行。
var color = "blue";
function changeColor(){
var anotherColor = "red";
function swapColors(){
var color = "yellow";
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
alert(color);
}
// swapColors();
}
changeColor();
理解二:
1、执行此代码,无结果输出。
changeColor()函数返回值为swapColors函数,而此时swapColors函数没有被调用,不会产生上下文,所以不会被执行。为了方便理解,我们最后增加一段代码console.log(changeColor());查看一下changeColor()调用结果为
function changeColor(){
function swapColors(){
var color = 999;
alert(color);
}
return swapColors;
}
changeColor();
注意:当return swapColors();时,页面会弹出“999”的弹窗,因为这时返回值调用了swapColors()函数方法。
2、执行此函数,会出现“999”的弹窗。
此时将changeColor()的返回值swapColors函数赋给result,再使用result()调用swapColors函数,其实就相当于直接调用了swapColors()。
function changeColor(){
function swapColors(){
var color = 999;
alert(color);
}
return swapColors;
}
var result = changeColor();
result();