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插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
Mar 23 jQuery
JavaScript使用链式方法封装jQuery中CSS()方法示例
Apr 07 jQuery
jquery中$.fn和图片滚动效果实现的必备知识总结
Apr 21 jQuery
jQuery Validate 校验多个相同name的方法
May 18 jQuery
jquery Ajax实现Select动态添加数据
Jun 08 jQuery
jQuery实现一个简单的验证码功能
Jun 26 jQuery
jQuery实现锚点向下平滑滚动特效示例
Aug 29 jQuery
基于jquery实现左右上下移动效果
May 02 jQuery
JS/jQuery实现获取时间的方法及常用类完整示例
Mar 07 jQuery
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
Sep 03 jQuery
jquery 回调操作实例分析【回调成功与回调失败的情况】
Sep 27 jQuery
jQuery 移除事件的方法
Jun 20 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
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
PHP统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
php实现的简单检验登陆类
2015/06/18 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
2016/09/22 PHP
accesskey 提交
2006/06/26 Javascript
JS实现兼容性较好的随屏滚动效果
2015/11/09 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
2016/04/29 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
Bootstrap基本插件学习笔记之按钮(21)
2016/12/08 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
webpack 2.x配置reactjs基本开发环境详解
2017/08/08 Javascript
JavaScript中递归实现的方法及其区别
2017/09/12 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
[06:35]2014DOTA2国际邀请赛 老男孩梦圆西雅图中国军团世界最强
2014/07/22 DOTA
[02:30]联想杯DOTA2完美世界全国高校联赛—北京站现场
2015/11/16 DOTA
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
Python补齐字符串长度的实例
2018/11/15 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
HTML5 常用语法一览(列举不支持的属性)
2010/01/26 HTML / CSS
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
员工入职担保书范文
2014/04/01 职场文书
文秘自荐信
2014/06/28 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
2016年清明节寄语
2015/12/04 职场文书
初中英语教学反思范文
2016/02/15 职场文书
利用Python判断你的密码难度等级
2021/06/02 Python
jQuery实现广告显示和隐藏动画
2021/07/04 jQuery