js面试题-----作用域与闭包

1、问题代码:

var length = 10;
function fn(){
    console.log(this.length);
}
var obj = {
    length:5,
    method:function(fn){
        fn();
        arguments[0]()
    }
}

obj.method(fn,1);//输出10  2

  解答:第一个fn执行的this是指向window 的所以this.length指的是10   而arguments[0]()可以理解为下面代码 这里的length是arguments本身的自己的length属性

var arguments = {
     0:fn,
     1:1,
     .
     .
     .
     length:2  
}

2、问题代码 

var obj = {
    getName:function(){
        console.log(this)
    }
}
obj.getName();//obj
(obj.getName)();//obj
(obj.getName = obj.getName)()//window

  解答:  第一个很明显 getName执行的this是obj    第二个不是很理解  大概理解为obj.getName是一个整体  自执行函数执行   也就是getName执行  所以 跟第一个一样 也是obj

  第三个可以这么理解  两边赋值之后的结果为function (){console.log(this)} = function (){console.log(this)}  所以此时执行的this是代表window(第二个希望有会的可以评论讲解一下 谢谢

题目1:说一下对变量提升的理解

答案:使用var定义的变量或者函数表达式在代码执行的时候 会先进行变量提升(声明)  即先赋值为undefined;而函数声明 会同时定义和声明

题目2:说明this几种不同的使用场景

答案:作为构造函数执行   作为对象属性执行  作为普通的函数执行   call  apply  bind

题目3:创建10个<a>标签,点击的时候弹出来对应的序号

答案:这里主要通过自执行函数来获取每次循环的时候的i值

var i,a;
for(i = 0;i<10;i++){
  (function(i){
     a = document.createElement('a');
     a.innerHTML = i+'<br>';
     a.addEventListener('click',function(e){
        e.preventDefault();
        alert(i);
     })
     document.body.appendChild(a);
   })(i)
}                        

题目4:如何理解作用域

答案:函数执行的时候  就会创建一个私有的作用域供里面的代码执行。当函数里面要访问变量的时候,首先会在自己的作用域当中进行查找,如果找不到会到其父级的作用域中继续查找,这就形成了一个作用域链。

题目5:实际开发中闭包的应用

答案:延长变量的生命周期,可以是函数外面访问函数内部的变量。

posted @ 2017-09-08 00:04  diasa  阅读(765)  评论(0编辑  收藏  举报