求解释这段代码的奇怪现象 本帖最后由 u011668126 于 2013-08-12 09:22:33 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <script type="text/javascript">var a=9; function dd(){ var a=5; return a; }alert(dd());//这里输出的却是undefined,为什么 function aa(){ return a;}alert(aa());</script> 首先,有两点需要知道:1.一个js代码段在执行之前,首先会把‘var’声明的变量进行预处理(相当于在执行之前标识出这些变量已经存在,但仅仅是标识出存在而已,并不根据实际代码对他们进行赋值而是赋值undefined)。2.函数在执行的时候,如果出现关于变量的操作,那么他会首先在内部查找有无该变量,如果没有再从包含它的函数或者全局一层一层往外查找。因此,具体到你的代码:dd在执行return a;的时候首先查找自己内部有没有变量a,显然是存在变量a的(因为var a=5已经在整个js段的执行前被预处理了,即声明变量a已经存在于dd内部),所以会返回a的值,但是:虽然a已经存在,但是a的赋值在return语句之后且不会被执行,所以当前a的值为undefined,所以dd()返回的是undefined。dd中的a和外部的a是两个仅仅名字相同但是毫无关系的变量,dd操作的是它自己内部的a。关于上面提到的2点,如果想了解的更透彻,楼主可以自行google“js执行顺序”和“js词法作用域”两个关键字。 只需记住同一片作用域,相同的变量名指代的必定是同一个变量dd函数内的a是函数内定义的a而不是函数外面的,alert时a未赋值所以是undefined a 没有赋值 js代码的执行是一步一步往下面执行的,所以会undefined js没有块级 作用域 也就是说你在函数内任意位置定义的变量 在该函数的任意位置都可以访问这个变量 甚至是变量定义之前 只不过变量为负值为undefined而已 请教guansong8079776,关于缩略图的问题 判断IE是否支持某个标签的方法? javascript 读取文件问题! JS对象调用 弹出窗口中想获取父窗口中子frame内的一个表格 取消 $.dialog 对话框的 关闭按钮 如何实现自动转移焦点功能? 如何实现如csdn一样双击时自动滚屏,再击时停止? 如何用脚本实现图片另存为 兄台们:如何通过javascript屏蔽鼠标右键? 滚动焦点图实现原理和实践[原创视频] .net下,easyUI datagrid 利用NPOI 导出生成EXECL
<script type="text/javascript">
var a=9;
function dd(){
var a=5;
return a;
}
alert(dd());//这里输出的却是undefined,为什么
function aa(){
return a;
}
alert(aa());
</script>
1.一个js代码段在执行之前,首先会把‘var’声明的变量进行预处理(相当于在执行之前标识出这些变量已经存在,但仅仅是标识出存在而已,并不根据实际代码对他们进行赋值而是赋值undefined)。
2.函数在执行的时候,如果出现关于变量的操作,那么他会首先在内部查找有无该变量,如果没有再从包含它的函数或者全局一层一层往外查找。因此,具体到你的代码:
dd在执行return a;的时候首先查找自己内部有没有变量a,显然是存在变量a的(因为var a=5已经在整个js段的执行前被预处理了,即声明变量a已经存在于dd内部),所以会返回a的值,但是:虽然a已经存在,但是a的赋值在return语句之后且不会被执行,所以当前a的值为undefined,所以dd()返回的是undefined。
dd中的a和外部的a是两个仅仅名字相同但是毫无关系的变量,dd操作的是它自己内部的a。关于上面提到的2点,如果想了解的更透彻,楼主可以自行google“js执行顺序”和“js词法作用域”两个关键字。
dd函数内的a是函数内定义的a而不是函数外面的,alert时a未赋值所以是undefined