JS基础面试题02--预解析与作用域

面试本没有坑,要饭的人多了,也就有了坑。

第一题

function a(b){
  console.log(b);
  var b =1;
}
a(100)

执行结果为100。
函数内部的var定义的变量会预解析提升到当前作用域的最顶端。所以预解析后如下:

function a(b){
  var b;
  console.log(b);
  b =1;
}
a(100)

提升后b默认的值是undefined,但由于函数有接收一个形参b=100,所以打印时b的值已经是100了。

第二题

function a(b){
  console.log(b);
  var b =1;
  function b(){};
  b =2;
  console.log(b);
}
a(100)

执行结果为function b(){}和2。
这一题考察的是预解析的优先级。函数永远是最大优先级。所以预解析后变量b和函数b都会提升,但同名的变量b会被函数b覆盖掉。

第三题

function fn(){
  console.log(a);
  console.log(b);
  console.log(c);
  console.log(d);
  if(false){
    function a(){};
    var b=1;
  }
  if(true){
    function c(){};
    var d=1;
  }
  console.log(a);
  console.log(b);
  console.log(c);
  console.log(d);
}
fn()

执行结果如下
在这里插入图片描述
这一题考察的点是if判断里面的代码在还没有执行的时候并不会进行预解析处理。

第四题

var A = (function(){
  var obj = {a:1,b:2};
  var a = {
    fn:function(e){
      return obj[e]
    }
  };
  return a
})()
console.log(A.fn('b'));

执行结果为2。
这一题主要考察的是闭包。首先A是经过自调用函数后返回的一个对象,对象上面有fn这个属性是一个函数,调用后返回obj[‘b’]。而此时浏览器会去哪里找obj呢?他不会去window下找,只会在一开始的自调用函数,也就是闭包里面找有没有obj这个对象。

第五题

(function(){
  var a=b=c=d=10;
})()
console.log(b,c,d);
console.log(a);

执行结果为10,10,10,报错not defined
上面的代码预解析后如下

(function(){
  b=c=d=10;
  var a=b;
})()
console.log(b,c,d);
console.log(a);

由此可以看出a的作用域是在函数内部,bcd是全局变量。

第六题

var a = 12;
function f1(){
  console.log(a);
};
function f2(){
  var a =34;
  f1();
}
f2();
console.log(a);

执行的结果为12,12。
这一题考察的点是函数的调用者。f2调用之后,里面要执行f1的调用,这里很容易被误导,认为此时f1在函数f2里面执行,那打印的a应该就是34。其实此时调用f1的是window。

第七题

var length = 7;
function f1(){
  console.log(this.length);
};
var obj = {
  a:10,
  f2:function(f1){
    f1();
    arguments[0]();
  }
}
obj.f2(f1,1)

执行的结果为7,2。
这一题考察的点是函数的调用者和arguments伪数组对象。首先 obj.f2 调用后,接收了两个参数 f1和1。所以就执行 f1 和 arguments[0] 。做过第六题后我们很容易知道此时调用f1的是window,所以会去全局找length,结果为7。而arguments是js的内置对象,是一个伪数组,表示传入的实参集合,也就是一开始f2接收的两个参数——arguments = [ f1, 1 ]。所以arguments[0] 就是 f1。但此时 f1 有了调用者,也就是arguments。所以this.length表示的是arguments的长度。

什么是妈妈?是为了你可以放弃自尊的强大的存在,是代替神守护你的存在,是只叫一声也触动心弦,力大无比的存在。
——《请回答1988》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值