我们在编写jQuery或者js的时候常常要自定义函数,并且写入一个js文件中,方便引入html中调用。那么就涉及到如何在js文件中书写jQuery和js自定义函数的问题了。
在介绍自定义函数之前必须先来了解下js的自执行函数。
一、js自执行函数介绍
我们通常将JS代码写在一个单独的JS文件中,然后在页面中引入该文件。但是,有时候引入后会碰到变量名或函数名与其它JS代码冲突的问题。那么如何解决这个问题呢?作用域隔离。在JS中,作用域是通过函数来划分的,将JS代码封装到函数中进行调用可以避免变量名/函数名冲突的问题,但是这也并不是万无一失,因为封装函数本身有可能和其它函数重名,解决方案:自执行函数。
自执行函数是用一对圆括号将匿名函数包起来,加括号(传参)会立即执行。因为函数无名字,实现了作用域的绝对隔离和函数名的冲突问题。创建这个自执行函数,就相当于开辟了一个新的命名空间,使里面的内容与其他空间隔离,这样就减少了js文件中的全局变量与其他全局变量名称相同的风险。
自执行函数的几种表现方式:
方式1:function外面加括号 (推荐,比较常见):
//不带参数的自执行(匿名)函数
(function() {
alert(x + y);
})();
//带参数的自执行(匿名)函数
(function(x, y) {
alert(x + y);
})(2, 3);
上面创建了一个匿名函数(在第一个括号内),第二个括号用于调用该匿名函数,并传入参数。两个括号都是表达式,是表达式就有返回值,所以可以在后面加一对括号让它们执行.当js的解析器执行到前一个括号后就返回一个函数对象然后连着后面一个括号就构成了一个完整的函数名+(参数)+;的函数执行语句。
方式2:最前最后加括号 (这是jslint推荐的写法,好处是,能提醒阅读代码的人,这段代码是一个整体)
(function() {
alert(1);
}());
方式3:function前面加运算符,常见的是!与void 。这样做的目的就是将函数转换成表达式。
!function() {
alert(1);
}();
void function() {
alert(2);
}();
二、js文件的自定义函数
上面介绍了自执行函数,所以我们可以用它来减少全局变量的使用,提高安全性。所以在js文件中,我们常常用自执行函数来包裹住我们的自定义函数。格式如下:
//自执行匿名函数
(function($){
//自定义函数的代码
})(jQuery);
那么自定义函数如何来定义呢,请看下面的方法
方法一:通过在jQuery全局变量中增加函数
//创建:通过在jQuery全局变量中增加函数
(function($){
//在jQuery这个全局变量对象中增加一个叫myFunction1的函数,函数参数根据需要自定
$.myFunction1=function(x,y){
//函数体
};
$.fn.myFunction2=function(x,y){
//函数体
};
})(jQuery);
//执行
$(function(){
$.myFunction1(1,2);
});
方法二:通过在jQuery全局变量中扩展程序
//创建两个函数
(function($){
//创建方法3
jQuery.extend({
"myFunction3":function(){
alert("我的自定义jquery方法3");
};
});
//创建方法4
jQuery.fn.extend({
"myFunction4":function(){
alert("我的自定义jquery方法4");
}
});
})(jQuery);
//执行
$(function(){
//执行方法3
$.myFunction3();
//执行方法4
//注意,在执行方法4的时候,必须要对象来调用,比如通过标签选择器$("button").myMethod(args);
$("对象").myFunction4();
});
注意:通过.fn定义的扩展方法,需要通过jQuery选择器调用,比如通过标签选择器$("button").myMethod(args)。
方法三:创建全局变量,在全局变量里面自定义函数
//在js文件中创建一个全局变量STUDENT,在对象里面自定义一个获得姓名和年龄的方法
var STUDENT={ //或者window.STUDENT,表示是该窗口的全局变量
name:"大哥",
age:"38",
//自定义函数
getNameAndAge:function(){
return "name:"+name,"age:"+age;
}
}
//执行,获取STUDENT对象中的信息
$(function(){
//获取学生的信息
var info=STUDENT.getNameAndAge();
});