javascript - js的一个小问题?
阿神
阿神 2017-04-10 15:37:11
[JavaScript讨论组]

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

阿神
阿神

闭关修行中......

全部回复(9)
阿神

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

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

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

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

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。(手机码字,有偏差请多多包涵)

PHP中文网

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

阿神
var i = 10;
function a(){
    var i;
    alert(i); //undefined;
    i = 2;
}
伊谢尔伦

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号