首先,有两点需要知道:
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词法作用域”两个关键字。