【Web前端问题】js的一个小问题?
按我的理解,执行a方法,先走到alert(i)(然后给a赋值),会找到全局变量var i=10,
为什么会先走到i=2(输出个局部变量)。
没有系统的学过js,以前是学java的,感觉还挺不一样。
回答:
这种情况下运行,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;
}
这样理解就没什么问题了。
回答:
以前别人推荐看JavaScript秘密花园,我也推荐你看下 http://bonsaiden.github.io/JavaScript-Garden/zh/
回答:
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的话就是局部变量,不加才是全局变量吧。
以上是 【Web前端问题】js的一个小问题? 的全部内容, 来源链接: utcz.com/a/142341.html