关于全局变量与局部变量

hztgcl1986 2011-08-05 11:21:39

//情况一
var i = 0;
function a()
{
window.alert(i); //弹出全局变量0
}
a();

//情况二
var i = 0;
function a()
{

var i = 2;
window.alert(i); //弹出局部变量2

}
a();

//情况三
var i = 0;
function a()
{
window.alert(i); //为什么这里会弹出undefined,而不是全局变量0
var i = 2;
}
a();
...全文
208 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
燥动的心 2011-08-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 hztgcl1986 的回复:]
关于第3种情况,我觉得11楼的解释最为正确了。
不过,12楼又提现了一个新的问题,

JScript code

alert(t) //为什么这里出错,,难道 只认 var?
t = 1


这个,谁能给个合理的解释呢?
[/Quote]
你没用到var ,只有执行到他赋值的时候才会再声明成全局变量。
燥动的心 2011-08-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wanghuicai_123 的回复:]
你这断代码其实等价于下面这样

//情况三
var i = 0;
function a()
{
var i;
window.alert(i);
i = 2;
}
a();[/Quote]
我也认为是这样的。
hztgcl1986 2011-08-07
  • 打赏
  • 举报
回复
关于第3种情况,我觉得11楼的解释最为正确了。
不过,12楼又提现了一个新的问题,

alert(t) //为什么这里出错,,难道 只认 var?
t = 1

这个,谁能给个合理的解释呢?
Mr-Jee 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fanchuanzhidu 的回复:]

引用 3 楼 cj205 的回复:
和作用域关系不大。看下解析和执行顺序吧
我把你的第三个稍微修改下。
(1)var i = 0;
(2)function a()
{
(3)window.alert(i); //为什么这里会弹出undefined,而不是全局变量0
(4)var i = 2;
}
a();

(1) (2) (4) (3)

这个问题就是个变量的作用域链……
[/Quote]
偏解。看完那篇文章去
豆虫 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cj205 的回复:]
和作用域关系不大。看下解析和执行顺序吧
我把你的第三个稍微修改下。
(1)var i = 0;
(2)function a()
{
(3)window.alert(i); //为什么这里会弹出undefined,而不是全局变量0
(4)var i = 2;
}
a();

(1) (2) (4) (3)
[/Quote]
这个问题就是个变量的作用域链问题
你把你的第一步移到最后 它还是会去找全局变量 与顺序无关
(2)function a()
{
(3)window.alert(i); //为什么这里会弹出undefined,而不是全局变量0
}
(1)var i = 0;
a();//还会弹出0
Mr-Jee 2011-08-05
  • 打赏
  • 举报
回复
随便找了下秦歌博客的一篇
http://dancewithnet.com/2007/03/22/order-of-execution-of-javascript-on-web/
001007009 2011-08-05
  • 打赏
  • 举报
回复
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


我也 疑惑啊。


Mr-Jee 2011-08-05
  • 打赏
  • 举报
回复
和作用域关系不大。看下解析和执行顺序吧
我把你的第三个稍微修改下。
(1)var i = 0;
(2)function a()
{
(3)window.alert(i); //为什么这里会弹出undefined,而不是全局变量0
(4)var i = 2;
}
a();

(1) (2) (4) (3)
豆虫 2011-08-05
  • 打赏
  • 举报
回复
首先 要理解js变量的作用域 先找局部变量 最后一步是找全局变量
情况1:
函数a里未定义局部变量i 所以找全局变量i 找到了是0
情况2:
已定义了局部变量i js不会再去找全局变量 所以alert的是2
情况3:
js是解释型语言 这么写变量i被局部了 不会去找全局变量 在alert之前未定义i 所以undefined
s1120624175 2011-08-05
  • 打赏
  • 举报
回复
也许是加载当前函数 声明是优先的 其次才会有动作

001007009 2011-08-05
  • 打赏
  • 举报
回复
我倒是觉得 变量声明是在预编译时声明的,而赋值是在代码执行时赋值的 这句话理解些。
001007009 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 kyzy_yy_pm 的回复:]
引用 15 楼 calmcrime 的回复:


alert(t)
var t = 1;
就相当于?
var t;
alert(t)
t = 1;


alert(t)
t = 1; //仅仅是赋值 而没有声明?

alert(t)
var t = 1;//这里将外面的同名变量屏蔽了,但是上面这个alert依然undefined,因为,虽然内存中存在,但是由于变量……
[/Quote]

师兄
var t = 1;//这里将外面的同名变量屏蔽了。。。。
这里没有什么外面里面的变量,我是举例,具体是 4楼那几个独立的代码段。

你举的变量屏蔽一说,我感觉有些疑惑,
我倒是觉得 变量声明是在预编译时声明的,而赋值是在代码执行时赋值的 这句话还理解些。
sygsygsyg222 2011-08-05
  • 打赏
  • 举报
回复
mark yixia
kyzy_yy_pm 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 calmcrime 的回复:]


alert(t)
var t = 1;
就相当于?
var t;
alert(t)
t = 1;


alert(t)
t = 1; //仅仅是赋值 而没有声明?
[/Quote]
alert(t)
var t = 1;//这里将外面的同名变量屏蔽了,但是上面这个alert依然undefined,因为,虽然内存中存在,但是由于变量在alert下面,所以并不等同与下面的

var t;
alert(t)
t = 1;


alert(t)
t = 1; //这个在初始化时候根本就没有被考虑进去
An4Greenhand 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fanchuanzhidu 的回复:]
首先 要理解js变量的作用域 先找局部变量 最后一步是找全局变量
情况1:
函数a里未定义局部变量i 所以找全局变量i 找到了是0
情况2:
已定义了局部变量i js不会再去找全局变量 所以alert的是2
情况3:
js是解释型语言 这么写变量i被局部了 不会去找全局变量 在alert之前未定义i 所以undefined
[/Quote]


就是这样。
chlxx08 2011-08-05
  • 打赏
  • 举报
回复
有碰到此问题,学习下
001007009 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 kyzy_yy_pm 的回复:]
引用 13 楼 calmcrime 的回复:

JScript code

alert(t) //undefined
var t = 1


JScript code

alert(t) //为什么这个不是undefined 而是报错
t = 1

js看来是先给变量分配内存在执行的,var表示给变量分配内存(加载页面初始化时),而没有var的再是临时创建的,这种变量用d……
[/Quote]

看了楼上推荐的文章,说是 变量声明是在 预编译时声明的,而赋值是在代码执行时赋值的,


alert(t)
var t = 1;
就相当于?
var t;
alert(t)
t = 1;


alert(t)
t = 1; //仅仅是赋值 而没有声明?


是不是这样理解?
kyzy_yy_pm 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 calmcrime 的回复:]

JScript code

alert(t) //undefined
var t = 1


JScript code

alert(t) //为什么这个不是undefined 而是报错
t = 1
[/Quote]
js看来是先给变量分配内存在执行的,var表示给变量分配内存(加载页面初始化时),而没有var的再是临时创建的,这种变量用delete都会报错,也就是说这种变量是系统回收不必认为手动销毁的

第一种可能是因为内存中确确实实存在的(因为初始化时候已经分配了),而第二种变量在alert时候根本内存中就没有它(因为是临时分配的)

以上都是个人观点,希望对楼主有点用
001007009 2011-08-05
  • 打赏
  • 举报
回复

alert(t) //undefined
var t = 1


alert(t) //为什么这个不是undefined 而是报错
t = 1


001007009 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 showbo 的回复:]
当JavaScript引擎解析脚本时,它会在预编译期对所有声明的变量和函数进行处理。所以,就会出现当

JScript code
JavaScript解释器执行下面脚本时不会报错:

alert(a); // 返回值undefined

var a =1;

alert(a); ……
[/Quote]

师兄,

alert(t) //为什么这里出错,,难道 只认 var?
t = 1


加载更多回复(4)

87,990

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧