关于JS全局变量的问题

我这里有2段简单的代码,一个是用var的全局变量,另一个是隐式的全局变量,他们都在函数的下方,为什么结果不一样呢!... 我这里有2段简单的代码,一个是用var的全局变量,另一个是隐式的全局变量,他们都在函数的下方,为什么结果不一样呢! 展开
 我来答
系统004
推荐于2016-09-05 · TA获得超过3254个赞
知道大有可为答主
回答量:1326
采纳率:68%
帮助的人:1147万
展开全部

您好:目测第一个结果应该会出错,第二个是undifind.首先明确变量声明中带var和不带的区别。

①如果在函数体外,带var和不带var都是全局变量。

②如果在函数体内,带var的是局部变量,运行结束后就会销毁。而不带var的依然是全局变量,属于window对象。

③带var的全局变量是立刻在内存中创建一块区域存储这个值,所以在js解析的时候会前置到最前面。而如果不带var,只能运行到此处的时候,再去查找所有的全局变量有没有声明,如果没声明才去创建内存区域存储这个值。

  由此,你第一张图中,x=3中,运行到abc()调用的时候,alert(x)中的x在window对象中还没有声明,应该会出现x未定义的错误。你可以试一下,把x=3放到abc()之前,就可以得到正确结果3了。因为这样,abc调用之前,x=3已经声明并且分配了内存值。

  图二中,在上面③中已经说明,带var的在运行时候会将声明会前置,所以解析器解析时候的代码就变成了:

   

  var x;
  funtion abc()
  {
      alert(x);
  }
  abc();
  x=3;

所以图2的结果,声明了,但是未赋值,所以结果是undifind.   

但是,虽然js中允许声明不带var的变量,但是为了代码的可维护,可读性更好。建议都加var。不带的话可能会给window增加一些很乱的对象。不利于以后维护。

追问

说的太好了,但是如果是这样的呢,又该如何理解呢!

追答
解答这个题之前先给你写一个例子,你看看结果是什么?
第一个例子:
fun1();
funtion fun1 (){
alert("1");

}
第二个例子:
fun2();

var fun2=funtion(){
alert("2");

}
这两个例子的结果是什么?
yfcp
2014-12-12 · 知道合伙人软件行家
yfcp
知道合伙人软件行家
采纳数:1748 获赞数:5545
有多年网站建设相关工作经验。熟悉ASP、ASP.net、VB、JavaScript、HTML等语言和CSS、Ajax等相关技术。

向TA提问 私信TA
展开全部

上面2中写法都是不正确的。

正确写法是:

function abc(){
alert(x)
}
var x=3; //先设置x值
abc();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
超大蒲公英
2014-12-12 · TA获得超过741个赞
知道小有建树答主
回答量:758
采纳率:75%
帮助的人:734万
展开全部
var x是声明性的,会在最初就执行。
x=3是执行性的,会按顺序执行。

你这第一段,会报错x未定义

第二段,能弹出来,但x没有值,是undefined
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jhy_0608
2014-12-12 · 超过44用户采纳过TA的回答
知道小有建树答主
回答量:73
采纳率:0%
帮助的人:77.9万
展开全部
不管怎样,变量应该先定义再调用
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式