按我的理解,执行a方法,先走到alert(i)(然后给a赋值),会找到全局变量var i=10,
为什么会先走到i=2(输出个局部变量)。
没有系统的学过js,以前是学java的,感觉还挺不一样。
按我的理解,执行a方法,先走到alert(i)(然后给a赋值),会找到全局变量var i=10,
为什么会先走到i=2(输出个局部变量)。
没有系统的学过js,以前是学java的,感觉还挺不一样。
http://segmentfault.com/a/1190000003013952看了这篇文章你应该就能明白了。
在函数内声明的变量var i = 2;属于局部变量,在全局环境下声明的变量var i = 1;属于全局变量,调用函数a,函数a的局部执行环境被创建,被推倒作用域链顶端,底端为全局变量,alert(i)的时候先从作用域顶端查找标识符,故结果为1。
alert出来的是undefined吧,不是10。这个是js作用域链的问题…在函数内有一个作用域,当然使用一个变量时,函数内部会帮你去找这个变量有没有定义,有则使用该值,没有就去上一层的作用域继续寻找,直到window…还是没有的话就给你报错了…还有,var定义变量会让变量声明提前,就是,alert方法前面会有个var i;而i没有赋值,所以是undefined。(手机码字,有偏差请多多包涵)
执行中确实是先走到alert(i),但是函数a预解析,因为你在a内部又声明了i,所以内部的i不再是全局变量,而是局部的,同时声明提前,所以i值为undifined,之前学java的话,应该是不了解js的预解析和声明提前吧
8 回答4.7k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
这种情况下运行,alert出来的应该是undefined吧。
这个涉及到javascript里面作用域和变量声明提前的问题。
以上两种写法是等同的。作用域的话楼主应该是明白,函数内的任何变量无论在哪里写的,执行时声明都会被提前到最前面。