zoukankan      html  css  js  c++  java
  • 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:实际开发中闭包的应用

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

  • 相关阅读:
    Weak Events in C#【译】
    Architecture
    在VS2012中使用NuGet引入Prism
    UIA Verify简介(未完待续)
    inspect无法抓到窗口控件详细信息
    从CSDN搬至博客园
    VC改变CListCtrl 表格中文字颜色,和背景颜色。
    vc 播放音乐
    VC字体对话框的初始化
    javac -cp java -cp
  • 原文地址:https://www.cnblogs.com/diasa-fly/p/7485374.html
Copyright © 2011-2022 走看看