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

一个没有理解面试题

一个没有理解面试题

肥皂起泡泡 2018-08-01 12:23:24
 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?求各位大神解答下
查看完整描述

2 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

这样是全局的:

var tt = 'aa';function test() {
    alert(tt);
}test();

这是你的例子:

var tt = 'aa';function test() {
    alert(tt);    
    var tt = 'dd';
    alert(tt);
}
test();

在函数内部使用var声明变量,是局部的。优先级高于函数外部的全局变量。
这个说明js解释器的解析顺序,尽管你的alert(tt)var tt = 'dd'前面,但是它还是认为你是在内部定义了一个局部变量。

function test() {    
var tt;
    alert(tt);
    tt = 'dd';
    alert(tt);
}


查看完整回答
反对 回复 2018-08-04
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

这题总结下来就2点知识:
1. 声明提升
2. 作用域链

先说后者,js在访问一个变量时会优先在该作用域(访问时的那个作用域)内寻找是否声明过该变量,如果该变量已经存在,则直接使用它的值,否则它会寻找该作用域的‘父作用域/上级作用域’,以此类推,直到找到全局作用域为止。

关于声明提升是指:js在解析的时候总是会将varfunction这类关键词的声明语句提升至该作用域的最顶部(注意:这里只会提升声明部分)。

于是你那段代码等价于下面

var tt = 'aa';   

function test(){    
      var tt; //这个tt未被赋值,按js的‘规矩’,它的值是`undefined`
    alert(tt);
    tt = 'dd';
    alert(tt);    
}   

test();

所以执行的时候返回的是 undefined 和 dd.


查看完整回答
反对 回复 2018-08-04
  • 2 回答
  • 0 关注
  • 1022 浏览
慕课专栏
更多

添加回答

举报

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