红皮书(6):函数表达式

递归

function factorial(num){
    if(num<=1){
        return 1;
    }else {
        return num * arguments.callee(num-1);
    }
}

console.log(factorial(4));

闭包

闭包是指有权接见另一个函数作用域中的变量的函数。

闭包与变量

作用域链的这类设置机制引出了一个值得注意的副作用,即闭包只能获得包括函数中任何变量的末了一个值。别忘了闭包所保留的是全部变量对象,而不是某个特别的变量。

function createFunctions(){
    var result = new Array();

    for (var i=0; i<10; i++){
        result[i] = function(){
            return i;
        }
    }

    return result;
}

我们可以经由过程建立另一个匿名函数强迫让闭包的行动相符预期。

function createFunctions(){
    var result = new Array();

    for (var i=0; i<10; i++){
        result[i] = function(num){
            return function(){
                return num;
            };
        }(i);
    }

    return result;
}

关于this对象

在全局函数中,this即是window,而当函数被作为某个对象的要领调用时,this即是谁人对象。不过,匿名函数的实行环境具有全局性,因而其this对象一般指向window。

var name = "The window";

var object = {
    name: "My Object",
    getNameFunc: function(){
        return function(){
            return this.name;
        };
    }
};

console.log(object.getNameFunc()()); // The window

不过,把外部作用域中的this对象保留在一个闭包可以接见到的变量里,就可以让闭包接见该对象了。

var name = "The window";

var object = {
    name: "My Object",
    getNameFunc: function(){
        var that = this;
        return function(){
            return that.name;
        };
    }
};

console.log(object.getNameFunc()()); // My Object

模拟块级作用域

用块级作用域(一般称为私用作用域)的匿名函数的语法以下所示:

(function(){
})();
    原文作者:小渝人儿
    原文地址: https://segmentfault.com/a/1190000000378141
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞