Maison > Questions et réponses > le corps du texte
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?
求各位大神解答下
大家讲道理2017-04-10 15:22:37
主要是js中的hoisting机制,第二次tt变量声明提升了,根据js的作用域链,它会在函数的作用域中找到tt的声明,而不是全局变量tt,hoisting机制具体参见这篇文章http://segmentfault.com/blog/liangyi/1190000002582759
天蓬老师2017-04-10 15:22:37
第一块的代码经过编译器的预编译后会变成这个样子:
javascript
var tt = 'aa'; function test(){ /* * 所有变量定义都会提到最上面,其实赋值语句是分为两步的, * 第一步定义变量:var tt,第二部赋值:tt = xxx;预编译 * 之只会把定义变量的语句移动到最上面,而复制语句还是在原 * 来的位置执行 */ var tt; alert(tt); // 此时tt为undefined tt = 'dd'; // 赋值为'dd' alert(tt); // 因此此时输出'dd' } test();
巴扎黑2017-04-10 15:22:37
根据js中函数作用域的特性,局部变量在整个函数作用域内都是有定义的,也就是说,这个时候局部变量会遮盖全局的同名变量,因此在函数体内alert的是局部变量tt。此时涉及到js的另外一个特性就是变量声明提前,即先var tt;然后再alert(tt),此时tt还没有被赋值,因此是undefined。