为了账号安全,请及时绑定邮箱和手机立即绑定

一个没有理解面试题

一个没有理解面试题

慕姐4208626 2019-04-10 20:48:57
vartt='aa';functiontest(){alert(tt);vartt='dd';alert(tt);}test();为什么第一个弹出undifine呢?又:vartt='aa';functiontest(){alert(tt);//vartt='dd';//alert(tt);}test();弹出aa?求各位大神解答下
查看完整描述

2 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

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

TA贡献1829条经验 获得超13个赞

这样是全局的:
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);
}
                            
查看完整回答
反对 回复 2019-04-10
  • 2 回答
  • 0 关注
  • 349 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信