和作用域关系不大。看下解析和执行顺序吧 我把你的第三个稍微修改下。 (1)var i = 0; (2)function a() { (3)window.alert(i); //为什么这里会弹出undefined,而不是全局变量0 (4)var i = 2; } a();(1) (2) (4) (3)
function a() { window.alert(i); //它要现在 函数体 里找 i var i = 2; }我也测试过,var i = 0; alert(i) //没问题 alert(i) //undefined var i = 0; alert(i) //出错 alert(i) //出错 i=0 我也 疑惑啊。
//情况三 var i = 0; function a() { window.alert(i); //为什么这里会弹出undefined,而不是全局变量0 var i = 2; } a();你这断代码其实等价于下面这样//情况三 var i = 0; function a() { var i; window.alert(i); i = 2; } a(); 所以那里弹出undefined 1.javascript的会把变量声明放到函数的最前面。 2.a方法的alert(i),i变量,js会先找a方法内的变量i,如果没有,向外层找i变量。(变量的scope) 通过以上二点就能解释这三种情况了
猜测是js先给声明变量后执行其它代码的原因吧,记得头几天有个类似的帖子var i = 0;【1】 function a() { window.alert(i); //【3】 var i = 2;【2】 } a();如果如我猜测那样,那么首先给【1】分配内存,接着是【2】,然后执行【3】,因为【1】被【2】屏蔽了(因为【2】比【1】优先),所以alert前面找不到i所以undefined
当JavaScript引擎解析脚本时,它会在预编译期对所有声明的变量和函数进行处理。所以,就会出现当JavaScript解释器执行下面脚本时不会报错:alert(a); // 返回值undefinedvar a =1;alert(a); // 返回值1由于变量声明是在预编译期被处理的,所以在执行期间对于所有代码来说,都是可见的。但是,你也会看到,执行上面代码,提示的值是undefined,而不是1。这是因为,变量初始化过程发生在执行期,而不是预编译期。在执行期,JavaScript解释器是按着代码先后顺序进行解析的,如果在前面代码行中没有为变量赋值,则JavaScript解释器会使用默认值undefined。由于在第二行中为变量a赋值了,所以在第三行代码中会提示变量a的值为1,而不是 undefined。具体参考 JavaScript变量函数预编译与执行顺序的关系
师兄,
alert(t) //为什么这里出错,,难道 只认 var? t = 1
alert(t) //undefined var t = 1 alert(t) //为什么这个不是undefined 而是报错 t = 1
看了楼上推荐的文章,说是 变量声明是在 预编译时声明的,而赋值是在代码执行时赋值的,那 alert(t) var t = 1; 就相当于? var t; alert(t) t = 1;而 alert(t) t = 1; //仅仅是赋值 而没有声明? 是不是这样理解?
alert(t) var t = 1;//这里将外面的同名变量屏蔽了,但是上面这个alert依然undefined,因为,虽然内存中存在,但是由于变量在alert下面,所以并不等同与下面的var t; alert(t) t = 1;而 alert(t) t = 1; //这个在初始化时候根本就没有被考虑进去
师兄 var t = 1;//这里将外面的同名变量屏蔽了。 这里没有什么外面里面的变量,我是举例,具体是 4楼那几个独立的代码段。你举的变量屏蔽一说,我感觉有些疑惑, 我倒是觉得 变量声明是在预编译时声明的,而赋值是在代码执行时赋值的 这句话还理解些。
关于第3种情况,我觉得11楼的解释最为正确了。 不过,12楼又提现了一个新的问题,alert(t) //为什么这里出错,,难道 只认 var? t = 1这个,谁能给个合理的解释呢?
情况1:
函数a里未定义局部变量i 所以找全局变量i 找到了是0
情况2:
已定义了局部变量i js不会再去找全局变量 所以alert的是2
情况3:
js是解释型语言 这么写变量i被局部了 不会去找全局变量 在alert之前未定义i 所以undefined
我把你的第三个稍微修改下。
(1)var i = 0;
(2)function a()
{
(3)window.alert(i); //为什么这里会弹出undefined,而不是全局变量0
(4)var i = 2;
}
a();(1) (2) (4) (3)
{
window.alert(i); //它要现在 函数体 里找 i
var i = 2;
}我也测试过,var i = 0;
alert(i) //没问题
alert(i) //undefined
var i = 0;
alert(i) //出错
alert(i) //出错
i=0
我也 疑惑啊。
http://dancewithnet.com/2007/03/22/order-of-execution-of-javascript-on-web/
你把你的第一步移到最后 它还是会去找全局变量 与顺序无关
(2)function a()
{
(3)window.alert(i); //为什么这里会弹出undefined,而不是全局变量0
}
(1)var i = 0;
a();//还会弹出0
//情况三
var i = 0;
function a()
{
window.alert(i); //为什么这里会弹出undefined,而不是全局变量0
var i = 2;
}
a();你这断代码其实等价于下面这样//情况三
var i = 0;
function a()
{
var i;
window.alert(i);
i = 2;
}
a();
所以那里弹出undefined
1.javascript的会把变量声明放到函数的最前面。
2.a方法的alert(i),i变量,js会先找a方法内的变量i,如果没有,向外层找i变量。(变量的scope)
通过以上二点就能解释这三种情况了
function a()
{
window.alert(i); //【3】
var i = 2;【2】
}
a();如果如我猜测那样,那么首先给【1】分配内存,接着是【2】,然后执行【3】,因为【1】被【2】屏蔽了(因为【2】比【1】优先),所以alert前面找不到i所以undefined
JavaScript变量函数预编译与执行顺序的关系
师兄,
alert(t) //为什么这里出错,,难道 只认 var?
t = 1
alert(t) //undefined
var t = 1
alert(t) //为什么这个不是undefined 而是报错
t = 1
看了楼上推荐的文章,说是 变量声明是在 预编译时声明的,而赋值是在代码执行时赋值的,那
alert(t)
var t = 1;
就相当于?
var t;
alert(t)
t = 1;而
alert(t)
t = 1; //仅仅是赋值 而没有声明?
是不是这样理解?
var t = 1;//这里将外面的同名变量屏蔽了,但是上面这个alert依然undefined,因为,虽然内存中存在,但是由于变量在alert下面,所以并不等同与下面的var t;
alert(t)
t = 1;而
alert(t)
t = 1; //这个在初始化时候根本就没有被考虑进去
师兄
var t = 1;//这里将外面的同名变量屏蔽了。
这里没有什么外面里面的变量,我是举例,具体是 4楼那几个独立的代码段。你举的变量屏蔽一说,我感觉有些疑惑,
我倒是觉得 变量声明是在预编译时声明的,而赋值是在代码执行时赋值的 这句话还理解些。
不过,12楼又提现了一个新的问题,alert(t) //为什么这里出错,,难道 只认 var?
t = 1这个,谁能给个合理的解释呢?