闭包经典题
2018-04-08 本文已影响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;
})()