<script language="Javascript">
var t="hello";
function text(){
alert(t);
var t="HELLO";
alert(t)
}
</script>
结果为:undefine,HELLO;
请高人解释下
var t="hello";
function text(){
alert(t);
var t="HELLO";
alert(t)
}
</script>
结果为:undefine,HELLO;
请高人解释下
这是因为在 函数内,编译器会把 var "声明"的变量自动提升到最语句前边,但是不会提升"赋值",
也就相当于function text()
{
var t;//提升到最前边并且覆盖全局变量,,
alert(t);
t='HELLO';
alert(t)}
你在下面又声明了以个t,虽然是在alert那个全局变量t以后声明的,但是js解析的时候发现你的局部变量声明有一个t,所以把你上面的t也认为是局部变量,而这时候他还是未声明的
作用域链(scope chain)。作用域链是一个name lookup机制,首先在当前执行环境的scriptObject中寻找,没找到,则顺着upvalue到父scriptObject中寻找,
一直lookup到全局调用对象(global object)。
---
楼主的代码中,
alert(t)时,引擎会在当前函数域内寻找是否有t的定义。
当找到var t="HELLO"; 时,就会认为t是在函数内定义的(这时就不会理睬全局的了).
但是,这个t是在alert(t)后定义的,在alert(t)时,就会认为是被声明而没定义。
因此,alert时,t为undefined
function text(){
alert(t);
var t="HELLO";
alert(t)
} 第二个t为新定义的变量,alert(t) 会不知道是哪个t,所以报错。