jquery之匿名函数心得

 

       当你开始学习第二种语言的时候,你可能会把你新学习的语言与自己比较熟悉的语言做对比,这样学的更快,更容易让人理解。两年前初次接触JQuery的时候,很是兴奋,因为它打出的口号是:”write less, do more”, 写更少的代码,做更多的事情。最值得让人欣慰的一点也是很多软件设计人员最头疼的事情JQuery帮做了——浏览器兼容问题,还有就是用简单的代码就可实现需要写大量javascript才能实现的功能等等其它的好处。

       现在直入正题,这篇文章与其说是jquery中的匿名函数,倒不如说是通过jquery对匿名函数的使用来学习js中匿名函数。JQuery匿名函数代码片段:

(function(){

//这里忽略jQuery所有实现

})();

要说匿名函数还得从函数本身说起,函数的定义如下:

        函数(function)表示每个输入值对应唯一输出值的一种对应关系。当然这是在数学中的定义,那么我们将数学定义转移到计算机语言来给函数下定义:将输入的若干数据,经过代码设定的逻辑操作处理后,返回唯一的输出的一组代码组合块。当然输入的数据和输出的数据都可能为空。Javascript给出的定义:函数(function)是定义一次但却可以调用或执行任意多次的一段javascript代码。

函数的声明(function):如果使用函数,我们必须先声明它的存在,然后才能调用,如下:

    function Demo(){

    //此处代码省略

    }

当然我们的Demo函数也可以包含参数且有返回值,如下:

    function Demo(param1,pararm2){

         return param1+param2;

        }

所以无论函数我们怎么定义JS都会把它翻译成Function,我们可以用代码alert(typeof Demo)来界面将弹出Function,Function是javascript中固有对象,所有的函数都是Function对象。

   匿名函数:所谓匿名函数也就是没有名称的函数。如下:

alert(typeof function () {}); //"function"

alert(typeof function (x, y) { return x + y; }); // "function"

1.匿名函数声明有多种方式:

(1) 函数字面量:首先声明一个函数对象,然后执行它。

(function () {

    alert('mouse');

})();

(2)当然也可以带参数

(function (m) {

    alert(m);

})(' mouse ');

(3) void操作符:用void操作符去执行一个没有用圆括号包围的一个单独操作数。

void function () {

    alert(' mouse ');

} ();

(4)匿名函数链式调用

(function (o) {

    alert(o);

    return arguments.callee;

})(' mouse ')('cat');

也可以在(function(){})前面添加特殊符号比如:~、!、+、-等等。第一种是我们常用的也是JQuery中经常使用的。

2.怎么调用匿名函数

(1) 调用函数,得到返回值。强制运算符使函数调用执行

(function (x, y) {

    alert(x + y);

    return x + y;

} (3, 4)); 

(2) 调用函数,得到返回值。强制函数直接量执行再返回一个引用,引用在去调用执行

(function (x, y) {

    alert(x + y);

    return x + y;

})(3, 4);

(3) 调用函数,忽略返回值

void function (x) {

    x = x - 1;

    alert(x);

} (9);

3.匿名函数的好处

通过例子来说明:

<script language="javascript">

var tmp=22222;

 (function () {

           var k = {

                cursor: 'hand',

                iptCurTarget: null,

                inputsource: "",

           runner:function(){}

            };

            k.runner = (function () {

                function A() {

                    alert(22);

                }

                function T() {

                    var date = new Date();

                    alert(date.getFullYear() + " 年" + date.getMonth() + " 月" + date.getDay()+"----http://www.592site.com");

                }

                return {

                    Alert: A,

                    showTime: T

                }

            })();

            k.hello=(function(name){

           var tmp=0;

                function  S(name)

                {

                    tmp++;

                    alert("你好啊," + name + "!" + "匿名函数内部的变量:" + tmp);

                }

                return {

                    sayHello:S

                }

            })();

            window.kingtop = k;

        })();

</script>

这种写法可以看做是私有的内部类,一般出于页面加载完后就需要立即执行的代码,类似于JQuery。我们在匿名函数的内定义了变量tmp,并在k.hello的内部对tmp++运算,匿名函数的外部也定义了变量tmp,我们先在页面上写两个事件:

        function test() {

            alert(kingtop.hello.sayHello('张三'));

        }

        function test2() {

           alert("全局变量:" +tmp);

            alert(kingtop.hello.sayHello('张三'));

        }

依次点击button1、button2页面弹出"你好啊,张三!匿名函数内部的变量:1"、"全局变量: 22222"、"你好啊,张三!匿名函数内部的变量:2"。

(1)通过弹出的界面我们发现全局的tmp变量并没有因匿名函数的tmp运算而发生变化,tmp变量在button2点击的时候变成2,或许你会问,点击button2时应该弹出1才对啊,因为再次调用该函数时对tmp又重新赋值了,正常的函数是这样,但是我们在匿名函数中用了闭包,闭包致使变量tmp在内存中没有释放,所以点击button2的时弹出的是2而不是1,等下在介绍闭包。

(2)K是这个闭包中的集合,集合中我们可以定义变量及方法,然后在集合外面来实现,或许你会问为什么集合中没有定义hello方法,集合外写k.hello的时候没有报错,这是因为在javascript可以动态的给集合添加元素,有点类似C#中的接口,可以继承接口的类中实现接口没有定义的函数。

(3)在闭包中定义的函数,如果外部调用则必须把该函数返回给外部,否则外部不能调用该函数中的方法,有点类似与C#定义public函数方便外部调用。

匿名方法的好处简而言之如下:

1.私有的函数在匿名函数外部调用不到,相对安全.

2.可用于onload事件保证不与其冲突.

3.不会发生变量命名的冲突

网站应用实例:www.592site.com 城市网址导航

下篇文章在介绍闭包.


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值