作用域的一些问题
写于平安夜
见书本第四章,先用四段简单的脚本,来做个,实例测试
示例1:
var PH='you are big Pig Head';
function getAlert()
{
alert(PH);
}
getAlert();
function getAlert()
{
alert(PH);
}
getAlert();
函数体内显示PH这个全局变量
这个比较好理解,结果如下
you are big Pig Head
示例2:
var PH='you are big Pig Head';
function getAlert()
{
alert(PH);
PH='you are be modified to Mouse ';
alert(PH)
}
getAlert();
function getAlert()
{
alert(PH);
PH='you are be modified to Mouse ';
alert(PH)
}
getAlert();
这里涉及到javascript的一个特性:
如果给一个未用var声明的变量赋值,javascript会隐式声明该变量。但是该变量会被创建为全局变量。
所以 分别显示
you are big Pig Head
you are be modified to Mouse
示例3
var PH='you are big Pig Head';
function getAlert()
{
alert(PH);
var PH = 't';
}
getAlert();
function getAlert()
{
alert(PH);
var PH = 't';
}
getAlert();
这个结果是 undefined。比较怪。
这里又涉及到一个javascript比较特别的东西:
书上专业的词讲就是:javascript没有块作用域。对我这种块作用域都不知道是什么东西的人,这个解释不尽人意。所以更通俗的解释是:在函数中生命的 所有变量,无论在哪里声明的,在整个函数中都是有定义的。也就是哪怕在函数最结尾声明的,它实际上效果是在函数的最开头就声明了。
从上面的例子来看,就是在alert(PH)的时候,从顺序看,貌似后面的var PH还没有声明,所以结果应该是显示全局声明的PH。而实际上后面那个var PH='t',在整个函数都是有“势力范围”的,所以相当于
var PH='you are big Pig Head';
Code
这么看就明显能看出来,因为局部声明的PH变量,又由于局部变量的优先级高于同名的全局变量。所以这里声明完PH,又没有赋值,所以alert出来是 undefined
当然要不出现undefined,就必须在alert前对它赋值,比如
var PH='you are big Pig Head';
function getAlert()
{
var PH = 'you are right';
alert(PH);
}
getAlert();
function getAlert()
{
var PH = 'you are right';
alert(PH);
}
getAlert();