重返jQuery(3)-函数

javascript的作用域是函数体,所有的操作都离不开函数。与函数有关的问题我想说的是三个感受,这三点是js所共有的,并不是jquery或前端开发独有的。在js做服务器的后端道理是一样的。

1.jquery是基于事件触发的。这很好理解,在web或者手机端都会用键盘,鼠标,触摸事件。这些事件是UI交互的基础。但是这里有个问题,事件交互时效性怎么保证呢?万一有一天NASA要开发一个APP安装在一个飞船上,保证10000000000000年以后,地外文明还可以使用怎么办? JavaScript通过回调函数,其实就是闭包来让这些交互事件放到页面上,不论你什么时候去操作,程序都可以响应。关于闭包看可以看重返jquery(1).

//比如下面这个函数,$(document).ready(),是外层函数
//function(){}这个是内层函数。通过这种方式形成一个闭包函数。
//这个结构,只要你不关掉网页,$("#switcher h3")可以一直恭候你的点击
$(document).ready(function() {
     $('#switcher h3').click(function() {
          $('#switcher button').toggleClass('hidden'); });
});
   ```

jquery中的闭包可以形成很多的闭包,怎么形容呢?看看下面这打地鼠的图


![th.jpeg](http://upload-images.jianshu.io/upload_images/2044710-4f3db2cb887bfa36.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/320)

闭包出现是在js变量回收机制前提下,对抗变量垃圾回收的一种解决办法。闭包函数可以一直保持变量状态,所以只要计算机还工作,web线程没关闭,这些闭包函数可以一直存在。 为了应对复杂的应用我们可以在页面中建很多闭包,就像打地鼠图中的地洞一样。一旦建好,虽然不知道什么时候那个洞会用上,但是他们会一直存在,等候你去打。事件响应机制是由闭包支持的。所以在jquery中闭包无处不在。

2.js单线程非阻塞机制。

javascript是单线程的,非阻塞的。这个概念困扰我很长时间。但是等我了解以后就发现这个机制其实很高明,效率大多数情况下都很高。
下面是我在另外一篇文章中对着问题的通俗解释
>js由于是单线程的模式,相当是一个饭馆只请了一个小二,这小二要负责所有用户的点餐,送餐和收钱的工作。所以不能在一个用户定了餐以后他就什么事也不干,等着饭好以后送给第一个客户,这样的模式下实际上主要的等待时间是等饭的准备,非常耗时间,在第一个客户订餐以后,小二记录下用户座位号码和点餐内容以后就可以去服务其他的顾客。当第一个客户的餐准备好了以后,恰好这时小二手头又没有其他工作的时候,他就会把第一个顾客的餐根据记录的座位号码送到顾客手中。当然第一个顾客先定,但是他可能不是第一个拿到餐,如果他定了一个比较耗时间的餐,比如红烧排骨,这个做起来比较复杂,第二个顾客定里一个凉拌黄瓜,这个简单,所以第二个顾客可能会先拿到凉拌黄瓜。

javascript就是用这个原理来解决单线程的效率问题。人还是一个人,但是在阻塞和非阻塞的情况下效率会差很多。 jquery中的回调函数就是解决这问题。 第一步相应事件-然后排队-第二步处理事件。

可以这么说:回调函数是jquery的灵魂。

3  jquery中的链式调用
jquery中的链式调用是效率非常高的方法。一开始尽管也可以用,但是还是不是太明白为什么可以这样操作。js的函数有个特点,在一个js函数调用的时候,总会附着(绑定)在一个对象上,关于这一点有点负杂,也是解开javascript this这个关键字的关键😀。我在下一篇会讲这个问题。  首先不管是绑定在哪个对象上,我们在jQuery中使用链式操作时要把链式操作的方法指向同一个对象。 那么怎么指向同一对象? 就用this这个关键字。 this的定义就是当前函数绑定的那个对象。那么好办了,我们只要在每个函数中都返货这个对象 
 var func= function(){
      return this;
 } 
这样后一个函数获得的对象就是前一个函数return 出来的this对象,这个对象是谁不重要。前后函数指向同一个对象的目的就达到了。


以上是我对jquery函数的一点理解。
    原文作者:smartphp
    原文地址: https://www.jianshu.com/p/565082e1cea6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞