天天看点

JS常见面试题(四)

1、什么是闭包?闭包产生的背景?有什么问题?怎么解决?举一个闭包的例子? 答: 什么是闭包:一个函数内部有另一个函数,内部的函数能使用外部函数的变量和方法。 闭包产生的背景:1)作用域的问题,全局作用域无法访问局部作用域 2)垃圾回收机制,执行完的函数和不在被引用的变量的内存会被销毁。 3)全局污染的问题,变量和函数名的冲突。 问题:这些问题的出现需要解决,那么闭包就应运而生了。但是由于闭包会长期占用内存,这样就会导致内存的泄露,这个也是闭包的最大问题。 解决:1)理解闭包,后期尽量避免闭包的使用。       2)手动销毁,使用完的函数或者变量,让其变量名等于null。 举例:页面上li输出相对应的索引值,经典的面试题。                  for(var i = 0;i < lis.length;i++){                     lis.οnclick= (function( num ){                                  return function(){                                          alert(num ) ;                                   };                            })(i ); 2、实现冒泡排序和数组去重? 答: 1)冒泡排序 var arr =[2,4,1,6,7,8,33,11];     function sort( array){     //使用双循环去遍历数组,第一个循环取 array 的一个数据,第二个循环拿上个循环数据的后面一个数据,两个数据进行比较。         for(var i = 0;i< array.length;i++){             for(var j = i+1;j < array.length;j++){                 if(array > array[j] ){                     varnum = array;                    array = array[j];                    array[j] = num; } } }//return 根据需要可写可不写。return array; } 2)数组去重 var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5]; function rep(arr) {       var ret = []; for (var i = 0; i <arr.length; i++) {      if (arr.indexOf(arr)== i){ ret.push(arr);         }      }      return ret; }