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 相关文章推荐
jquery.form.js异步提交表单详解
Apr 25 jQuery
jQuery中clone()函数实现表单中增加和减少输入项
May 13 jQuery
jquery dataTable 后台加载数据并分页实例代码
Jun 07 jQuery
jQuery使用ajax_动力节点Java学院整理
Jul 05 jQuery
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
Aug 09 jQuery
jQuery实现的下雪动画效果示例【附源码下载】
Feb 02 jQuery
jQuery实现的回车触发按钮事件功能示例
Mar 25 jQuery
jquery 动态遍历select 赋值的实例
Sep 12 jQuery
jQuery实现的隔行变色功能【案例】
Feb 18 jQuery
jquery实现自定义树形表格的方法【自定义树形结构table】
Jul 12 jQuery
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
Nov 09 jQuery
jQuery+ajax实现文件上传功能
Dec 22 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
DC的38部超级英雄动画电影
2020/03/03 欧美动漫
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
php的XML文件解释类应用实例
2014/09/22 PHP
PHP连接access数据库
2015/03/27 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
js类的静态属性和实例属性的理解
2009/10/01 Javascript
Jquery实现带动画效果的经典二级导航菜单
2013/03/22 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
关闭时刷新父窗口两种方法
2014/05/07 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
2014/07/23 Javascript
jQuery元素的隐藏与显示实例
2015/01/20 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
浅谈js 闭包引起的内存泄露问题
2015/06/22 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
2017/01/23 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
vue中用H5实现文件上传的方法实例代码
2017/05/27 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
浅谈python字符串方法的简单使用
2016/07/18 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
详解Python yaml模块
2020/09/23 Python
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
活动总结格式范文
2014/04/26 职场文书
治庸问责工作总结
2015/08/11 职场文书
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python