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获取radio选中的值
May 05 jQuery
JQuery 获取多个select标签option的text内容(实例)
Sep 07 jQuery
详解jquery插件jquery.viewport.js学习使用方法
Sep 08 jQuery
jQuery第一次运行页面默认触发点击事件的实例
Jan 10 jQuery
[原创]jquery判断元素内容是否为空的方法
May 04 jQuery
jQuery.extend 与 jQuery.fn.extend的用法及区别实例分析
Jul 25 jQuery
深入浅析angular和vue还有jquery的区别
Aug 13 jQuery
jQuery实现购物车的总价计算和总价传值功能
Nov 28 jQuery
jQuery实现当拉动滚动条到底部加载数据的方法分析
Jan 24 jQuery
基于jQuery实现挂号平台首页源码
Jan 06 jQuery
jQuery Datatables 动态列+跨列合并实现代码
Jan 30 jQuery
jQuery实现动态向上滚动
Dec 21 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
ajax php 实现写入数据库
2009/09/02 PHP
PHPLog php 程序调试追踪工具
2009/09/09 PHP
php防注入及开发安全详细解析
2013/08/09 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
学习php设计模式 php实现策略模式(strategy)
2015/12/07 PHP
Netbeans 8.2将支持PHP7 更精彩
2016/06/13 PHP
解决php写入数据库乱码的问题
2019/09/17 PHP
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
jQuery日期范围选择器附源码下载
2017/05/23 jQuery
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
使用Vue生成动态表单
2019/11/26 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python语言技巧之三元运算符使用介绍
2013/03/04 Python
python开发利器之ulipad的使用实践
2017/03/16 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
2018/06/13 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
python 初始化一个定长的数组实例
2019/12/02 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
日本食品网上商店:JaponShop.com
2017/11/28 全球购物
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
宠物店的创业计划书范文
2014/01/11 职场文书
德语专业求职信
2014/03/12 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
Python 使用dict实现switch的操作
2021/04/07 Python
golang中的struct操作
2021/11/11 Golang