var tt = 'aa'; function test(){ alert(tt); var tt = 'dd'; alert(tt); } test();
为什么第一个弹出undifine呢?
又:
var tt = 'aa'; function test(){ alert(tt); //var tt = 'dd'; //alert(tt); } test();
弹出aa?
求各位大神解答下
认证0级讲师
主要是js中的hoisting机制,第二次tt变量声明提升了,根据js的作用域链,它会在函数的作用域中找到tt的声明,而不是全局变量tt,hoisting机制具体参见这篇文章http://segmentfault.com/blog/liangyi/1190000002582759
第一块的代码经过编译器的预编译后会变成这个样子:
javascriptvar tt = 'aa'; function test(){ /* * 所有变量定义都会提到最上面,其实赋值语句是分为两步的, * 第一步定义变量:var tt,第二部赋值:tt = xxx;预编译 * 之只会把定义变量的语句移动到最上面,而复制语句还是在原 * 来的位置执行 */ var tt; alert(tt); // 此时tt为undefined tt = 'dd'; // 赋值为'dd' alert(tt); // 因此此时输出'dd' } test();
javascript
var tt = 'aa'; function test(){ /* * 所有变量定义都会提到最上面,其实赋值语句是分为两步的, * 第一步定义变量:var tt,第二部赋值:tt = xxx;预编译 * 之只会把定义变量的语句移动到最上面,而复制语句还是在原 * 来的位置执行 */ var tt; alert(tt); // 此时tt为undefined tt = 'dd'; // 赋值为'dd' alert(tt); // 因此此时输出'dd' } test();
根据js中函数作用域的特性,局部变量在整个函数作用域内都是有定义的,也就是说,这个时候局部变量会遮盖全局的同名变量,因此在函数体内alert的是局部变量tt。此时涉及到js的另外一个特性就是变量声明提前,即先var tt;然后再alert(tt),此时tt还没有被赋值,因此是undefined。
作用域内声明提升了
其实我觉得LZ对于局部 全局应当是了解的(这都不懂还去面试?) 只不过没有想到声明提升而已
楼主作用域链没有搞明白,先去看书吧
大家都已经回答的很好了,这是各类js书上作用域章节中都会出现的例子,哈哈。
那个公司面试的,那么简单~~~
求告知公司名
主要是js中的hoisting机制,第二次tt变量声明提升了,根据js的作用域链,它会在函数的作用域中找到tt的声明,而不是全局变量tt,hoisting机制具体参见这篇文章http://segmentfault.com/blog/liangyi/1190000002582759
第一块的代码经过编译器的预编译后会变成这个样子:
根据js中函数作用域的特性,局部变量在整个函数作用域内都是有定义的,也就是说,这个时候局部变量会遮盖全局的同名变量,因此在函数体内alert的是局部变量tt。此时涉及到js的另外一个特性就是变量声明提前,即先var tt;然后再alert(tt),此时tt还没有被赋值,因此是undefined。
作用域内声明提升了
其实我觉得LZ对于局部 全局应当是了解的(这都不懂还去面试?)
只不过没有想到声明提升而已
楼主作用域链没有搞明白,先去看书吧
大家都已经回答的很好了,这是各类js书上作用域章节中都会出现的例子,哈哈。
那个公司面试的,那么简单~~~
求告知公司名