javascript自执行函数


Posted in Javascript onFebruary 10, 2017
function (window, $, undefined) {
 play=function(){
  $("#demo").val("This is a demo.");
 }
 window.wbLogin = play;
})(window, jQuery);

像上边这样的代码为什么要把window, jQuery对象传进去?

为什么要传入 jQuery?

通过定义一个匿名函数,创建了一个“私有”的命名空间,该命名空间的变量和方法,不会破坏全局的命名空间。这点非常有用也是一个 JS 框架必须支持的功能,jQuery 被应用在成千上万的 JavaScript 程序中,必须确保 jQuery 创建的变量不能和导入他的程序所使用的变量发生冲突。

为什么要传入 window?

通过传入 window 变量,使得 window 由全局变量变为局部变量,当在 jQuery 代码块中访问 window 时,不需要将作用域链回退到顶层作用域,这样可以更快的访问 window;这还不是关键所在,更重要的是,将 window 作为参数传入,可以在压缩代码时进行优化,看看 jquery-1.6.1.min.js:

(function(a,b){})(window); // window 被优化为 a

为什么要传入 undefined?

在自调用匿名函数的作用域内,确保 undefined 是真的未定义。因为 undefined 能够被重写,赋予新的值。

一句话,使全局变量以参数形式变成自执行函数内部的局部变量。

至于为什么这么做,提高程序效率。为什么能提高效率,得从javascript的机制说起,所谓的scope chain作用域链,在当前作用域中如果没有该属性(局部变量)则向上一层作用域中寻找,一直到最上层,也就是window。也就是说全局变量和下级作用域都是window的一个属性,向下依此类推。

另外jQuery传入后将参数写成$可以保证在此函数内$为jquery而不是其他类似使用$符号的库。

undefined同理,由于没有传入第三个参数,自然就是undefined。由于javascript中undefined是一个变量,可以被改变,所以这样可以保证undefined判断时的准确性。有时判断时使用typeof xxx === 'undefined'也是因为这个原因。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
Extjs学习笔记之四 工具栏和菜单
Jan 07 Javascript
SWFObject 2.1以上版本语法介绍
Jul 10 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
Aug 11 Javascript
js定时器(执行一次、重复执行)
Mar 07 Javascript
ExtJS4给Combobox设置列表中的默认值示例
May 02 Javascript
Javascript变量的作用域和作用域链详解
Apr 02 Javascript
Bootstrap导航简单实现代码
Mar 06 Javascript
jQuery模拟窗口抖动效果
Mar 15 Javascript
javascript实现的图片预览功能
Mar 25 Javascript
JS实现浏览上传文件的代码
Aug 23 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
Jan 19 Javascript
javascript实现简易计算器功能
Sep 23 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
Feb 10 #Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
Feb 10 #Javascript
JS验证不重复验证码
Feb 10 #Javascript
使用jquery给新生的th绑定hover事件的实例
Feb 10 #Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
Feb 10 #Javascript
jQuery移除或禁用html元素点击事件常用方法小结
Feb 10 #Javascript
jQuery基于Ajax方式提交表单功能示例
Feb 10 #Javascript
You might like
php图片加中文水印实现代码分享
2012/10/31 PHP
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
php生成rss类用法实例
2015/04/14 PHP
PHP如何实现跨域
2016/05/30 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
JS 获取滚动条高度示例代码
2013/10/24 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
2015/04/16 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
2019/04/09 Javascript
Vue学习之常用指令实例详解
2020/01/06 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
Python实现常见的回文字符串算法
2018/11/14 Python
python中退出多层循环的方法
2018/11/27 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
房地产员工找工作的自我评价
2013/11/15 职场文书
总裁秘书岗位职责
2013/12/04 职场文书
法人委托书范本
2014/04/04 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
MySQL 聚合函数排序
2021/07/16 MySQL
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js