• 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:实际开发中闭包的应用

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

  • 相关阅读:
    poj 2485 Highways 最小生成树
    hdu 3415 Max Sum of MaxKsubsequence
    poj 3026 Borg Maze
    poj 2823 Sliding Window 单调队列
    poj 1258 AgriNet
    hdu 1045 Fire Net (二分图匹配)
    poj 1789 Truck History MST(最小生成树)
    fafu 1181 割点
    减肥瘦身健康秘方
    人生的问题
  • 原文地址:https://www.cnblogs.com/diasa-fly/p/7485374.html
Copyright © 2020-2023  润新知