第一家面试【总结】

首先面试官的提问

1.对js的闭包有什么理解

2.jQuery和BootStrap有什么区别

3.Es6怎么定义一个变量

4.js如何定义一个变量,有var和没var的区别是什么?

5.Mabatis如何实现分页?

6.接口和抽象类的区别?

7.有哪些数据结构?

8.JS如何链到手机端(说实话是真的不了解,没做过APP)

9.如何新增一行button?

答案如下:

1.js的闭包:

闭包就是一个函数引用另外一个函数的变量,因为变量被引用着所以不会被回收。

JS的解释器是这样做的:当函数执行完毕后,由JS解释器的垃圾回收机制来释放内存,即定期执行,判断一块被占用的内存区域是否还被可用变量所引用,如果没有直接释放内存,如果有,就不释放。

举例说明:

function createFunctions(){
   var result = new Array();
   for ( var i=0; i < 10; i++){
     result[i] = function (){
       return i;
     };
   }
   return result;
}
var funcs = createFunctions();
for ( var i=0; i < funcs.length; i++){
   console.log(funcs[i]());
}

这段代码的输出结果不是0~9,而是10个10

关键点就在于var f = function(){ alert("123")}; 这样一行代码是不会alert东西出来的,因为这一句根本不能执行函数,如果加上f();就可以执行了。

所以以上代码就能很好解释了,在creatFunctions()函数当中,for循环里面代码的效果就是result[f,f,f,f,f,...]这样的一个数组。说得通俗一点就是由于方法没执行,所以数组里面存放的其实是function(就是for循环里面的function的方法体)。所以createFunction()函数执行完了以后得到的就是一个result数组,数组里面是有方法体(return i ;)的函数,还有呢就是执行完了以后,该方法里面的i就变成了10。funcs是创建的一个变量,也是一个数组,那个下面的for循环的结果呢就是输出数组的值,例funcs[0]();这一句呢就是输出result数组的0下标的值,刚才说过,数组里面每一位都是函数,那么0下标的自然也是函数,函数的函数体是   return i ;   此时的关键就在于i是多少,那我们也说过了,执行完了createFunction()函数的时候i已经变成了10,此时直接执行return i ;所以结果就是打印出10。同理,result数组的每个元素都打印出10,因为i是没有变的。

那以上例子和闭包之间的联系在于什么呢,i就是关键,我们可以看到这一句  var funcs = createFunctions();  该句的作用呢就是创建一个函数,得到createFunction函数的值,那么在createFunction()函数里面呢,有这样一句, return result;  这一句呢就意味着要用到createFunction()函数里面的变量(i),所以就产生了闭包。所以就会变量i导致了以上程序产生了闭包。


再举一个例子,直接上代码

var a = function(x){
    var b = 'bb';
    var inner = function(){
        var c = 'cc';
        console.log(inner === closure);
    };
    return inner ;
};

var closure = a();

closure();/*输出控制台:true*/

那么我们使用闭包产生的原理——一个函数引用了另一个函数的变量来分析这段代码,由于 

var closure = a();

这句将a函数的返回结果给了closure()函数,而在a()函数里面有这样一句 

 return inner ;

那么inner是一个函数,既然要返回它肯定就要执行它,所以就会用到它的变量,就产生了闭包。


2.jQuery和BootStrap有什么区别    引用【https://blog.csdn.net/detergent/article/details/79061557】:

之前一直只知道这是前端的两个框架,以为没有多大的联系,反正前端框架很多嘛,这些名称是总能听到,但是都不知道具体是些什么,现在深究这个问题的时候发现,就这一个问题还值得花时间去钻研。网上找了一些相关文章看,大致弄懂了一些概念性的问题。

概念:

jQuery是一个前端框架,那么它到底做了些什么呢,它封装了js常用的功能代码,提供一种简便的js设计模式,优化HTML文档操作,事件处理,动画设计和Ajax交互。即它是一个js函数库,更偏重于操作DOM,对DOM的遍历和修改。

BootStrap是一个响应式的框架,包含css和jQuery插件,依赖于jQuery。更偏向于页面布局样式设计。

区别:

1.Bootstrap以及jQuery主要以Web Site场景为主 也就是网站的页面展示层 能够提供很多艳丽的效果

2.Bootstrap是一个前台框架,包含css和jQuery插件,所以,它和jQuery必须一起使用。即使用时引入jQuery

3.Bootstrap中定义了很多样式,利用其提供的样式随意组合基本上就能满足一些页面的样式需求。

4.由于Bootstrap是响应式框架,会根据浏览设备不同,展示不同的效果。所以,如果要用jQuery做一个网站的话,pc端用jQuery-ui,手机端用jQuery-mobile【需要做两套网站】。而用Bootstrap就只需要做一套。

自己的看法:

那其实我自己总结的话,我认为jQuery和Bootstrap是没有特别大的可比性的,因为从分类来讲Bootstrap和easyUi(基于jQuery的框架,更侧重于页面显示)更像是一类,那么Bootstrap更偏向于简单的小页面,简约美观,而easyUi看起来有些呆板,但是API封装得特别好,可以避免引入额外的插件。

3.Es6怎么定义一个变量

ES6声明变量是用let声明的,js是用var来声明的,区别在于let只在其声明的代码块内有效果。例


以上代码中就可以看到,在代码块之外,a是没有定义的,找不到,而var声明的b是可以正确返回结果的。

这样设计的好处也是很多的,详见阮一峰ES6教程    http://es6.ruanyifeng.com/#docs/let

4.js如何定义一个变量,有var和没var的区别是什么?

在上一个问题就说过了,js是用var定义变量的,那么有var没var是否有区别呢?

首先一段os:有时候会直接 变量=某个值,也没有用var声明,好像能正常使用,也没有出错。但是没有深层次的想究竟是全局还是局部,也不知道什么时候会出现undefined的情况。

好了,查询资料上答案:

1.方法内加var,局部变量,不加var,全局变量

2.方法外加var,全局变量,不加var,要求赋值,不然会报undefined;



猜你喜欢

转载自blog.csdn.net/dai_aixy/article/details/80779195