javascript -function- 函数从基本到闭包详解

javascript – 从基本函数到闭包详解

1)函数定义、
函数:一种代码的分组形式,可以通过这种形式赋予某组代码一个名字,以便日后重用时调用。

2)、函数组成、
a. function 子句(数据类型)。
b. 函数名字,也可以没有函数,称为匿名函数。
c. 函数所要执行的代码块,称为函数体。
d. 函数参数,0到多个,每个浏览器都不一样,谷歌最大可以支持10多万个。调用的时候可以不传和多传,不传参数为undefined,多传忽略.每个函数都有一个内建的arguments数组,它能返回函数接受到的所有参数。
e. return 子句,函数通常都有返回值,没有显示返回就返回undefined。

3)、申明函数
首先函数在JavaScript中其实是一种数据类型,对函数变量调用typeof,会返回function。
申明有俩中方式:
a. function foo(){return 1;}
b. var foo = function(){return 1;}
第二种申明方式通常被称为函数标识记法。
函数有2个特性
a. 他们所包含的是代码。
b. 他们是可以执行的。
由于函数也是赋值给变量的一种数据,我们可以使用delete删除函数 delete foo。
调用函数只要在方法名后面加上(),就可以了。(匿名函数定义后自行执行一次。需要在后面加上()才会执行。)

4)、函数几个特别形式
a.匿名函数
匿名函数顾名思义,没有给函数定义名字。
其实在javascript中一个数据类型的对象既没有赋值给变量,也没有被赋予任何名字,就是匿名数据,就好比我们下面代码
null;
123;
这些代码我们都可以称为一段匿名数据。
匿名函数主要有俩个用处,
第一个是匿名回调函数,将匿名函数作为参数传递给其他函数。(在jquery中经常出现参数就一段代码.)
主要优点:
1,有可以在不命名变量的情况下传递函数,意味这可以节省全局变量。
2,我们可以将一个函数调用操作委托给另一个函数。
3,有助于提升性能(私有的区域来存储数据,执行后即销毁,避免常驻内存。)。

第二个是自调函数,函数在定义后自行执行。执行某些一次性或初始化任务。
主要优点:不会产生任何全局变量。
主要缺点:无法重复执行(除非放在循环或者其他函数内)

b.内部函数
内部函数就是在申明全局函数的同时,在其内部也申明一个函数,由于作用域的关系,内部函数在父函数外部是不可见的,我们也可以称这个内部函数为私有函数。
私有函数的优点:
1,有助于我们确保全局名字空间的纯净性。
2,私有性-这使我们可以选择只将一些必要的函数暴露给调用者,隐藏自己私有行为,起到了封装的效果。

c.返回函数的函数
函数总会有一个返回值,若不显示返回就返回一个undefined,之前提到函数其实也是数据,所以函数的返回值也可以是一个函数。
下面的例子很有意思.

    function foo(){
        alert('A');
        return function(){
            alert('B');
        };
    }
    var f = foo();
    f();

执行var f = foo();时,只会弹出’A’,执行f()才会弹出‘B’,要想一句代码连续弹出A和B,可以这么写 var f=foo()();同时调用俩次。

d.重写自己的函数
由于一个函数可以返回另外一个,因此我们可以使用新的函数来覆盖旧的。
前面一个例子就可以这样写:

    function foo(){
        alert('A');
        return function(){
            alert('B');
        };
    }
    foo = foo();

这句话也就是先弹出A,然后直接使用返回函数覆盖foo。
上面是外部重写自己的函数,当然也可以内部覆盖,如下:

    function foo(){
        alert('A');
        foo = function(){
            alert('B');
        };
    }

foo 在外部定义是全局变量,在函数内部可以直接使用。

5).闭包
说闭包之前先说下javaScript的作用域和词法作用域。
a)、作用域:
javaScript不存在大括号级的作用域,但是有函数作用域,也就是说,在函数内部定义的变量,在函数外面是不可见的。但是在函数外面定义的变量,在函数内部是可以见的。
定义在函数外面的变量,相对函数来说是”父级“作用域,函数可以操作”父级“作用域变量,反过来不行。
b)、词法作用域
在javaScript中,每个函数都有一个自己的词法作用域。也就是说,每个函数在被定义时(而非执行时)都会有一个属于自己的环境(即作用域)。一个函数只能访问自身和全局作用域中的内容。

c)、利用闭包突破作用域链
如何突破作用域链,我们只需要将他们升级为全局变量(不使用var 语句)或通过函数传递(或返回)给全局变量即可。
函数所绑定的作用域本身,而不是该作用域中的变量或变量当前所返回的值。(说明下,只要闭包函数执行完成,如果多个闭包外的对象指向闭包内的同一个变量,那么闭包外的对象值都是一样的因为都是同一个引用)

var getValue,setValue;
(function(){
    var secret = 0;
    getValue = function(){
        return secret;
    };
    setValue = function(v) {
        secret = v;
    }
})();

闭包确实有很多好处,但是也有缺点,容易造成内存泄露,开销大的问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值