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插件之validation插件
Mar 29 jQuery
jquery.validate.js 多个相同name的处理方式
Jul 10 jQuery
jQuery EasyUI开发技巧总结
Sep 26 jQuery
jQuery代码优化方法总结
Jan 29 jQuery
jQuery实现模拟搜索引擎的智能提示功能简单示例
Jan 27 jQuery
jquery实现二级导航下拉菜单效果实例
May 14 jQuery
jQuery层叠选择器用法实例分析
Jun 28 jQuery
jQuery实现input[type=file]多图预览上传删除等功能
Aug 02 jQuery
jQuery实现滑动星星评分效果(每日分享)
Nov 13 jQuery
Jquery高级应用Deferred对象原理及使用实例
May 28 jQuery
基于ajax及jQuery实现局部刷新过程解析
Sep 12 jQuery
jQuery实现飞机大战小游戏
Jul 05 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
重置版宣传动画
2020/04/09 魔兽争霸
PHP 日志缩略名的创建函数代码
2010/05/26 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
PHP中cookie和session的区别实例分析
2014/08/28 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
2015/11/30 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
mac中利用NVM管理不同node版本的方法详解
2017/11/08 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
python链接Oracle数据库的方法
2015/06/28 Python
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
Numpy中的mask的使用
2018/07/21 Python
Python3 log10()函数简单用法
2019/02/19 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
Python3.7实现验证码登录方式代码实例
2020/02/14 Python
python 实现性别识别
2020/11/21 Python
python3中数组逆序输出方法
2020/12/01 Python
python 批量将中文名转换为拼音
2021/02/07 Python
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
保时捷设计:Porsche Design
2019/03/30 全球购物
房地产管理毕业生自荐信
2013/11/04 职场文书
学校司机岗位职责
2013/11/14 职场文书
倡议书格式
2014/04/14 职场文书
2014年妇女工作总结
2014/12/06 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
2016年国陪研修感言
2015/11/18 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL
vue+iview实现手机号分段输入框
2022/03/25 Vue.js
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python