猿问

一个没有理解面试题

vartt='aa';
functiontest(){
alert(tt);
vartt='dd';
alert(tt);
}
test();
为什么第一个弹出undifine呢?
又:
vartt='aa';
functiontest(){
alert(tt);
//vartt='dd';
//alert(tt);
}
test();
弹出aa?
求各位大神解答下
慕姐4208626
浏览 350回答 2
2回答

慕后森

这题总结下来就2点知识:1.声明提升2.作用域链先说后者,js在访问一个变量时会优先在该作用域(访问时的那个作用域)内寻找是否声明过该变量,如果该变量已经存在,则直接使用它的值,否则它会寻找该作用域的‘父作用域/上级作用域’,以此类推,直到找到全局作用域为止。关于声明提升是指:js在解析的时候总是会将var,function这类关键词的声明语句提升至该作用域的最顶部(注意:这里只会提升声明部分)。于是你那段代码等价于下面javascriptvartt='aa';functiontest(){vartt;//这个tt未被赋值,按js的‘规矩’,它的值是`undefined`alert(tt);tt='dd';alert(tt);}test();所以执行的时候返回的是undefined和dd.

烙印99

这样是全局的:javascriptvartt='aa';functiontest(){alert(tt);}test();这是你的例子:javascriptvartt='aa';functiontest(){alert(tt);vartt='dd';alert(tt);}test();在函数内部使用var声明变量,是局部的。优先级高于函数外部的全局变量。这个说明js解释器的解析顺序,尽管你的alert(tt)在vartt='dd'前面,但是它还是认为你是在内部定义了一个局部变量。javascriptfunctiontest(){vartt;alert(tt);tt='dd';alert(tt);}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答