zoukankan      html  css  js  c++  java
  • 从javascript一道闭包面试题说开去

    这道题目比较经典了:

    var a = 1;
    function test(){
        a = 2;
        return function(){
            console.log(a);
        }
        var a = 3;
    }
    test()();

    当时我回答出来了正确答案,但是在一系列追问之下露出了狐狸的尾巴。答案是2

    我当时认为test执行之后,a=2赋值给了全局,那么返回function时那里的a指的是window.a,就是2了。

    实际上var a=3这一句是陷阱。 由于变量提升 a=2之前有一个var a的声明,这里的a变成了局部的值。

    那么返回函数为什么输出2? 因为闭包,外层的变量对内部可见。

    var a = 1;
    function test(){
        a= 2; 
        return function(){
            console.log(this.a);
        }
        var a = 3;
    }
    test()();

    加大一下难度,这里会输出什么呢?

    由于已经知道var a=3是陷阱,而javascript的函数this默认情况是window,so答案是1.

    var name = "The Window";   
      var object = {   
        name : "My Object",   
        getNameFunc : function(){ 
              console.log(this.name);
          return function(){   
            console.log(this.name);  
         };   
        }   
    };   
    object.getNameFunc()();

    这里输出是

    My Object

    The Window.

    闭包作用域在函数{}内,this在闭包内不能传递,改成下面这样才能都输出My Object.

     var name = "The Window";   
      var object = {   
        name : "My Object",   
        getNameFunc : function(){ 
              console.log(this.name);
              var tmp= this;
          return function(){   
            console.log(tmp.name);  
         };   
        }   
    };   
  • 相关阅读:
    一道有意思的面试算法题
    你真的了解回流和重绘吗
    一道面试题引起的思考
    手把手教你实现一个引导动画
    你可能不知道的setInterval的坑
    不到50行代码实现一个能对请求并发数做限制的通用RequestDecorator
    使用装饰者模式做有趣的事情
    广告
    vue运行svg文件
    el-table表格样式设置方法 :cell-class-name
  • 原文地址:https://www.cnblogs.com/huashiyiqike/p/5426499.html
Copyright © 2011-2022 走看看