JavaScript自执行函数和jQuery扩展方法详解


Posted in jQuery onOctober 27, 2017

我们通常将JS代码写在一个单独的JS文件中,然后在页面中引入该文件。但是,有时候引入后会碰到变量名或函数名与其它JS代码冲突的问题。那么如何解决这个问题呢?作用域隔离。在JS中,作用域是通过函数来划分的,将JS代码封装到函数中进行调用可以避免变量名/函数名冲突的问题,但是这也并不是万无一失,因为封装函数本身有可能和其它函数重名,解决方案:自执行函数。

自执行函数是用一对圆括号将匿名函数包起来,加括号(传参)会立即执行。因为函数无名字,实现了作用域的绝对隔离和函数名的冲突问题。基本形式如下:

(function () {
  console.log('do something');
})();

比如我们在custome.js文件中写了一些JS逻辑,并封装到函数init中。我们用自执行函数将自己定义的函数init包起来,就像下面这样。

(function () {

  function init() {
    console.log('execute init...');
  }

  init();
})();

当我们在html中引入custome.js:<script src="custome.js"></script>,自执行函数会立即执行,进而执行内部定义的init函数:

不过,自执行函数立即执行的特性,使其很难调用。通过定义jQuery扩展方法,可以解决这一问题,拿到自执行函数调用和执行的主动权。

首先我们看一下定义jQuery扩展方法的基本形式:

jQuery.extend({
  'myMethod': function () {
    console.log('do something');
  }
});

这样,通过$.myMethod()或jQuery.myMethod()就可以调用上面定义的方法。

定义jQuery扩展方法还有另外一种方式:.fn

jQuery.fn.extend({
  'myMethod': function () {
    console.log('do something');;
  }
});

通过如上方式定义的扩展方法,需要通过jQuery选择器调用,比如通过标签选择器$("button").myMethod(args)

了解了JS自执行函数和jQuery扩展方法后,我们将二者结合起来。

下面我们利用自执行函数立即执行的特点,来定义jQuery扩展方法:

(function (jq) {

  function init() {
    console.log('do something');
  }

  jq.extend({
    'myMethod': function () {
      init();
    }
  })
})(jQuery);

说明,这个自执行函数接收jQuery对象作为参数,然后在内部为jQuery定义一个扩展方法myMethod,该方法执行真正的逻辑代码init函数

调用:

<script src="jquery-3.2.1.js"></script>
<script src="custome.js"></script>
<script>

 $(function () {
  $.myMethod();
 });

</script>

说明:

jQuery文件引入后,jQuery对象全局可用;
紧接着引入自定义JS文件custome.js,其中的自执行函数接收jQuery对象为参数,立即执行,在内部为jQuery定义一个扩展方法myMethod
然后我们就可以在页面加载完成后,通过调用$.meMethod()或jQuery.myMethod()来执行init函数

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

jQuery 相关文章推荐
浅谈struts1 &amp; jquery form 文件异步上传
May 25 jQuery
使用jQuery实现动态添加小广告
Jul 11 jQuery
jQuery remove()过滤被删除的元素(推荐)
Jul 18 jQuery
jQuery中过滤器的基本用法示例
Oct 11 jQuery
jQuery中 DOM节点操作方法大全
Oct 12 jQuery
jquery在启动页面时,自动加载数据的实例
Jan 22 jQuery
jQuery实现模拟搜索引擎的智能提示功能简单示例
Jan 27 jQuery
jQuery对底部导航进行跳转并高亮显示的实例代码
Apr 23 jQuery
jQuery提示框插件SweetAlert用法分析
Aug 05 jQuery
jQuery操作元素追加内容示例
Jan 10 jQuery
jQuery实现容器间的元素拖拽功能
Dec 01 jQuery
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
Mar 31 jQuery
jquery使用iscorll实现上拉、下拉加载刷新
Oct 26 #jQuery
使用JQuery实现图片轮播效果的实例(推荐)
Oct 24 #jQuery
jquery select插件异步实时搜索实例代码
Oct 20 #jQuery
利用jQuery实现简单的拖曳效果实例代码
Oct 20 #jQuery
jQuery访问浏览器本地存储cookie、localStorage和sessionStorage的基本用法
Oct 20 #jQuery
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
Oct 19 #jQuery
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
Oct 19 #jQuery
You might like
php mssql 时间格式问题
2009/01/13 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
jQuery实现按比例缩放图片的方法
2017/04/29 jQuery
vue-cli V3.0版本的使用详解
2018/10/24 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
[02:44]完美大师赛主赛事淘汰赛第二日观众采访
2017/11/24 DOTA
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
Python实现的金山快盘的签到程序
2013/01/17 Python
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
python使用append合并两个数组的方法
2015/04/28 Python
关于python的list相关知识(推荐)
2017/08/30 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
整个世界的设计师家具在哈恩:Designathome
2019/03/25 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
自考生自我评价分享
2014/01/18 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
六五普法宣传标语
2014/10/06 职场文书
明星邀请函
2015/02/02 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
文艺晚会开场白
2015/05/29 职场文书
小学美术教学反思
2016/02/17 职场文书
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL