码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript 闭包系列二 --- 匿名函数及函数的闭包

时间:2014-10-23 12:08:41      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   ar   使用   java   for   

一. 匿名函数

1. 函数的定义,可分为三种

1) 函数声明方式

function double(x) {
    return 2*x;
}

2)Function构造函数,把参数列表和函数体都作为字符串,不方便,不建议使用

var double = new Function(‘x‘, ‘return 2*x;‘);

3)函数表达式方式

var double = function(x) {
    return 2*x;
}

该形式中,等号右边是一个匿名函数,创建函数完毕后,将该函数赋给了变量double。

2. 匿名函数

1)第一种方式

var double= function(x) {
    return 2*x;
}

等号右边是一个匿名函数。注意匿名函数不能直接独立的房子代码中,如下代码

functino(x) {
    return 2*x;
}                  //SyntaxError: Unexpected token (

2)第二种方式

(function(x,y) {
    console.log(x+y);
})(2,3);

创建一个匿名函数(在第一个括号内),第二个括号用于调用该匿名函数并传入参数。

 

二. 闭包(Closure)

闭包的含义:外层函数包含内层函数,内层函数可以访问外层函数的所有变量,即使外层函数执行完毕。(JavaScript作用域链)

题外话:上述对于闭包的解释与《JavaScript 闭包系列一》中不完全吻合。 上述解释,闭包成立只需满足:函数inner嵌套在函数outer内部。另一些文章对于闭包的解释,闭包成立需要两个条件:1)函数inner嵌套在函数outer内部;2)函数outer返回函数inner。对此,我已经凌乱了,各路大侠谁能够给个定论?

Example 1:函数outer是瞬间执行的(约0.00001毫秒),在函数outer体内创建了一个变量str,在outer执行完毕后,str变量未被释放,这是由于setTimeout内的匿名函数存在对变量str的引用。等到2秒后,匿名函数执行完毕,str才被释放。

function outer() {
    var str = "closure";
    setTimeout(function() {
        console.log(str);
    }, 2000);
}
outer();  //closure

Example 2:此例是否为闭包呢?

function outer() {
    var i = 22;
    (function inner() {
        console.log(i);
    })();
}
outer();  //22

Example 3:简化代码

function forTimeout(x, y) {
    console.log(x + y);
}
function delay(x, y, time) {
    setTimeout(‘forTimeout(‘ + x + ‘,‘ + y + ‘)‘, time);
}
//简化后
function delay(x, y, time) {
    setTimeout(
        function() {
            forTimeout(x,y);
        }
    ,time);
}
delay(3, 4, 2000); //7


三. 匿名函数与闭包

匿名函数的最大用途是创建闭包,它也可用来构建命名空间,减少全局变量的使用。

Example1: 匿名函数中的addEvent和removeEvent为局部变量,但是可以通过全局变量oEvent使用它,大大减少了全局变量的使用,增强了网页的安全性。

var oEvent = {};
(function() {
    var addEvent = function() {};
    function removeEvent(){}

    oEvent.addEvent = addEvent;
    oEvent.removeEvent = removeEvent;
})();

 

 

JavaScript 闭包系列二 --- 匿名函数及函数的闭包

标签:style   blog   color   io   os   ar   使用   java   for   

原文地址:http://www.cnblogs.com/sun-mile-rain/p/4045371.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!