专治各种function,傻傻分不清,打狗棒法之《捣乱狗窝》

阅读: 评论:0

专治各种function,傻傻分不清,打狗棒法之《捣乱狗窝》

专治各种function,傻傻分不清,打狗棒法之《捣乱狗窝》

看jquery中的源码,经常遇到各种所写,傻傻分不清什么意思,这里做一个总结

区别 (function($){...})(jQuery)、$(function(){ })和$.fn

一、(function($){…})(jQuery)

首先function(arg){…}定义了一个匿名函数,参数为arg,而调用时需要在函数后面写上括号和实参,由于操作符的优先级,函数本身也需要括号,也就成了:
(function(arg){…})(param)
这就相当于定义了一个参数为arg的匿名函数,并将param作为参数来调用这个匿名函数
而(function($){…})(jQuery)则是一样的,之所以只在形参使用$,是为了不与其他库冲突,所以实参用jQuery,其实可以这么理解,不过要注意的是fn是不存在的,函数直接定义,然后就运行了,然后就压缩成如下:

(function($){...})(jQuery)

二、$(function(){})

是$(document).ready(function(){…})的简写形式,意思就是页面载入后执行其中的代码,也可以被写成:

jQuery(function(){…});
jQuery(document).ready(function(){…})

两者相比:

  1. jQuery(function(){…});用于存放操作DOM对象的代码,执行其中代码时DOM对象已经存在。不可用于存放开发插件的代码,因为jQuery对象没有得到传递,外部通过hod也调用不了其中的方法(函数)。
  2. (function(){…}(jQuery);用于存放开发插件的代码,执行其中代码时DOM不一定存在,所以直接自动执行DOM操作的代码,请小心使用。
  3. 简单理解是(function($){…})(jQuery)用来定义一些需要预先定义好的函数
    $(function(){…})则是用来在DOM加载完成之后运行/执行那些预先定义好的函数。
  4. 开发jQuery插件时,一般先看jQuery(function(){…}),意义为在DOM加载完毕后执行了ready()方法,再看(function(){…})(jQuery).

三、$.fn

  1. $.fn是指jQuery的命名空间,加上fn的方法及属性,会对每一个jquery实例有效。
    如定义了$.fn.initPageMe(),即对jQuery扩展了一个initPageMe方法,那么后面你的每一个jQuery实例都可以引用这个方法了。
$.fn.initPageMe=function(opts){...};   //定义扩展方法
$(function(){$(".pageMe").initPageMe();             //调用扩展方法
})

四、$与$.fn

  1. $是jQuery的一种表现形式。
  2. jQuery的扩展方式有:
1.$.func1=function(){}
2.$.extend({func1:function(){}})
3.$.fn.func1=function(){}
4.$.fn.extent({func1:function(){}})
  1. $拓展的方法是静态方法,可以使用$直接调用,其拓展的方式有两种,一般使用$.extend({});;
  2. 而$.fn拓展的方法是实例方法,必须由“对象$("")来调用,其拓展的方式同样有两种,一般使用$.fn.extend({ })。

其中,fn与prototype等同使用;jQuery.fn = jQuery.prototype

五、(function(){}())与(function(){})()

这两种写法,都是一种立即执行函数的写法,即IIFE (Immediately Invoked Function Expression)。这种函数在函数定义的地方就直接执行了。

通常的函数声明和调用分开的写法如下:

function foo() {//} // 这是定义,Declaration;定义只是让解释器知道其存在,但是不会运行。

foo(); // 这是语句,Statement;解释器遇到语句是会运行它的。

普通的函数声明function foo(){}是不会执行的。这里如果直接这样写function foo(){}()解释器会报错的,因为是错误的语法。
IIFE函数的调用方式通常是将函数表达式、它的调用操作符、分组操作符放到一个括号内,来告诉解释器这里有一个需要立即执行的函数。否则通常情况下,解析器遇到一个function关键字,都会把它当做是一个函数声明,而不是函数表达式。
如下几种写法都是可以的:

(function foo(){/*...*/}());(function foo(){/*...*/})();!function foo() {/*...*/}();+function foo() {/*...*/}();-function foo() {/*...*/}();~function foo() {/*...*/}();在需要表达式的场景下,就不需要用括号括起来了:

在一个页面中不同的js中写的$(function(){//});函数,会根据js的排列顺序依次执行。

本文发布于:2024-02-04 15:12:18,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170710273556611.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:专治   狗窝   分不清   打狗棒   function
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23