js的一个小问题?

按我的理解,执行a方法,先走到alert(i)(然后给a赋值),会找到全局变量var i=10,
为什么会先走到i=2(输出个局部变量)。
没有系统的学过js,以前是学java的,感觉还挺不一样。
图片描述

阅读 4.1k
9 个回答

这种情况下运行,alert出来的应该是undefined吧。
这个涉及到javascript里面作用域和变量声明提前的问题。

function a(){alert(i); var i = 2;}
function a(){var i; alert(i); i = 2;}

以上两种写法是等同的。作用域的话楼主应该是明白,函数内的任何变量无论在哪里写的,执行时声明都会被提前到最前面。

  • 对于同名变量,根据”就近原则“,按近的变量的值计算
  • 对于不同位置的变量赋值,根据”变量提升“后的结果计算

http://segmentfault.com/a/1190000003013952看了这篇文章你应该就能明白了。
在函数内声明的变量var i = 2;属于局部变量,在全局环境下声明的变量var i = 1;属于全局变量,调用函数a,函数a的局部执行环境被创建,被推倒作用域链顶端,底端为全局变量,alert(i)的时候先从作用域顶端查找标识符,故结果为1。

你可以简单理解成,所有的声明都会被前置。。

function a(){
    var i;
    alert(i);
    i = 2;
}

这样理解就没什么问题了。

alert出来的是undefined吧,不是10。这个是js作用域链的问题…在函数内有一个作用域,当然使用一个变量时,函数内部会帮你去找这个变量有没有定义,有则使用该值,没有就去上一层的作用域继续寻找,直到window…还是没有的话就给你报错了…还有,var定义变量会让变量声明提前,就是,alert方法前面会有个var i;而i没有赋值,所以是undefined。(手机码字,有偏差请多多包涵)

执行中确实是先走到alert(i),但是函数a预解析,因为你在a内部又声明了i,所以内部的i不再是全局变量,而是局部的,同时声明提前,所以i值为undifined,之前学java的话,应该是不了解js的预解析和声明提前吧

var i = 10;
function a(){
    var i;
    alert(i); //undefined;
    i = 2;
}

好像加var的话就是局部变量,不加才是全局变量吧。

推荐问题
宣传栏