风言枫语  

今天遇到了一个问题,抽象出来的代码如下:

 

var zoom=13;
function setZoom(){
zoom=14;
}
function displayZoom(){

this.setZoom();
alert(zoom);
var zoom=1500;
this.changeZoom();
alert(zoom);
}

function changeZoom(){
this.zoom=++zoom;
}


执行结果

 


………………………………………………

…………………………



………………



………………


很诧异  undefined 1500


找找原因,是因为displayZoom()内部重新定义了zoom变量,去掉这个var

 

var zoom=13;
function setZoom(){
zoom=14;
}
function displayZoom(){

this.setZoom();
alert(zoom);
zoom=1500;
this.changeZoom();
alert(zoom);
}

function changeZoom(){
this.zoom=++zoom;
}

执行结果是

 


………………………………


……………………





……………………



14 1501

不诧异了


找了找解释:任何程序语言中变量的作用域都是一个很关键的细节。JS中变量的作用域相对与JAVA、C这类语言显得更自由,一个很大的特征就是JS变量没有块级作用域,函数中的变量在整个函数都中有效

简单的说


 

function displayZoom(){

this.setZoom();
alert(zoom);
var zoom=1500;
this.changeZoom();
alert(zoom);
}

这段代码,执行时,等同于

 

 

function displayZoom(){
var zoom;
this.setZoom();
alert(zoom);
zoom=1500;
this.changeZoom();
alert(zoom);
}


所以执行结果是:undefined 1500

 


p.s,为了避免上面的这类问题,因此在函数开始位置集中做函数声明是一个极力推荐的做法。 


dml@2013.8.22

 

posted on 2013-08-22 19:33  风言枫语  阅读(219)  评论(0)    收藏  举报