美文网首页
闭包经典题

闭包经典题

作者: 木中木 | 来源:发表于2018-04-08 08:52 被阅读0次
for (var i = 1; i <= 5; i++) {
  setTimeout( function timer() {
      console.log(i+'m');
  }, 1000 );
}
以上输出  5个6
如何做到输出每个数呢?
①如下
for (let i = 1; i <= 5; i++) {
  setTimeout( function timer() {
      console.log(i+'m');
  }, 1000 );
}
②如下
for (var i = 1; i <= 5; i++) {
    (function(i){
        setTimeout( function timer() {
          console.log(i+'m');
      }, 1000 );
    })(i)
}

使用var或是非对象内部的函数表达式内,可以访问到存放当前函数的变量;在对象内部的不能访问到。

原因也非常简单,因为函数作用域链的问题,采用var的是在外部创建了一个fn变量,函数内部当然可以在内部寻找不到fn后向上册作用域查找fn,而在创建对象内部时,因为没有在函数作用域内创建fn,所以无法访问

解如下题:

function fun(n,o) {
  console.log(o)
  return {
    fun:function(m){
      return fun(m,n);
    }
  };
}
var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1);  c.fun(2);  c.fun(3);//undefined,?,?,?
//问:三行a,b,c的输出分别是什么?






//a: undefined,0,0,0
//b: undefined,0,1,2
//c: undefined,0,1,1
function Animal() {  
    this.name = "Animal";  
    this.showName = function() {  
        console.log(this.name);  
    };  
}  
  
function Cat() {  
  
    this.name = "Cat";  
    this._super = Cat.prototype;  
  
    this.showName1 = function() {  
        console.log(this.name);  
    };  
  
    this.showName2 = function() {  
        console.log(this.name);  
    };  
  
    this.showName3 = function() {  
        console.log(this._super.name + "=>" + this.name);  
    };  
}  
Cat.prototype = new Animal();  
var cat = new Cat();  
console.log(cat instanceof Animal);   //true  
cat.showName1();     //"Cat"  
cat.showName2.call(Cat.prototype);   //"Animal"  
cat.showName3();    //"Animal" => "Cat"  

编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组:
var arr = [[1,2,2],[3, 4, 5, 5],[6, 7, 8, 9,[11,12,[12,13,[14]]]],10];
=>
var res= [1,2,3,4,5,6,7,8,9,10,11,12,13,14]

function copeArray(initArray){
    var result = [];
    result = delayering(initArray);
    console.log(quickSort(result));
}
var quickSort = function(){
    
    var result = [];
    var arr = arguments[0];
    if(arr.length<=1){
        return arr;
    }
    var middleIndex = Math.floor(arr.length/2);
    var minddleItem = arr.splice(middleIndex,1);
    var leftItem = [];
    var rightItem = [];
    
    arr.map((item,index)=>{
        if(item<minddleItem){
            leftItem.push(item)
        }else{
            rightItem.push(item);
        }
    })
    return quickSort(leftItem).concat(minddleItem).concat(quickSort(rightItem))
     
}
var delayering = function(){
    var result = [];
    var arr = arguments[0];
    arr.map((item,index)=>{
        if(Array.isArray(item)){
            var temp = delayering(item);
            temp.map((item,index)=>{
                if(result.indexOf(item)===-1){
                    result.push(item)
                }
            })
        }else{
            if(result.indexOf(item)===-1){
                result.push(item);
            }
        }
    })
    return result ;
}

闭包实现单例

var  GetInstance =(function (name,age){
    var person;
    function Person(){
        this.name = name;
        this.age = age;
    }
    function getInst(){
        debugger;
        if(person !=null){
            return person;
        }else{
            person = new Person();
            return person;
        }
    }
    Person.prototype.showName = function(){
        console.log('name:'+this.name+','+this.age);
    }
    return getInst;
})()

相关文章

  • 闭包经典题

    小测试 手动想想为何输出以上值

  • 闭包经典题

    使用var或是非对象内部的函数表达式内,可以访问到存放当前函数的变量;在对象内部的不能访问到。 原因也非常简单,因...

  • 闭包经典题

    click me click me click me click me var elements = d...

  • JavaScript深入之闭包

    JavaScript深入系列第八篇,介绍理论上的闭包和实践上的闭包,以及从作用域链的角度解析经典的闭包题。 定义 ...

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • Python闭包

    闭包 = 环境变量 + 函数 调用闭包内部的环境变量 闭包的经典误区 闭包与非闭包实现人类走路 非闭包 闭包

  • js闭包问题

    javascript 闭包的概念,闭包的作用,闭包经典面试题详解(配图解) 函数作用域(闭包前置知识) 要彻底弄懂...

  • 闭包题

    函数在执行的过程中,先从自己内部找变量; 如果找不到,再从创建当前函数所在的作用域去找,依此往上; 注意找的是变量...

  • 闭包经典题(答案及解释)

  • 关于Javascript闭包的总结

    关于闭包这个词的解释 维基百科中对于闭包的经典解释: 在计算机科学中,闭包(Closure)是词法闭包(Lexic...

网友评论

      本文标题:闭包经典题

      本文链接:https://www.haomeiwen.com/subject/drvehftx.html