那些年成为node攻城狮的路(七)

函数

  • 函数声明和函数表达式
function fn(){...}//函数声明,具有提升作用,执行代码之前就会先读取。
var fn = function(){...}//函数表达式

*函数中的几个属性

  • arguments 在node.js中为{0:value1....构成的 下标-参数 键值对}
(function(){
console.log(arguments);{ '0': 'a', '1': 'b', '2': 'c', '3': 'd' }
})('a','b','c','d');
  • arguments.length,实际参数的个数
(function(){
console.log(arguments.length);//4
})('a','b','c','d');
  • arguments.callee
(function(){
console.log('arguments.callee',arguments.callee);
})('a','b','c','d');
/*运行结果,指向函数自身
function (){
console.log('arguments.callee',arguments.callee);
}*/
  • arguments.call.caller || fn.caller
function inner(){
console.log('caller',inner.caller);
}
function outter(){
    inner();
}
/*
函数调用者的父环境outter()
*/
  • this
    作为对象方法调用 = 指向调用对象
    函数调用 = 指向全局对象
    作为构造函数 = 指向所创建的实例

  • 块级作用域
    javscript不存在块级作用域,可以使用如下方式模拟

(function(){
    //code....这里面都是块级作用域
})()
  • 闭包

1、函数内部嵌套函数
2、保留函数执行环境的所有活动对象,常驻内存,不会被回收

//局部变量实现累加
function add(){
    var i=0;
    return function(){
        return ++i;
    }
}
var add=add();
console.log(add());//1
console.log(add());//2
console.log(add());//3
console.log(add());//4
name='globa'
var o={
    name:'my object',
    getName:function(){
        var that=this;//保存了指向o这个对象的信息,并未被回收
        return function(){
            console.log(that.name);
        }
    }
}
o.getName()();//my object
name='globa'
var o={
    name:'my object',
    getName:function(){
        return function(){
            console.log(this.name);//最终this成为了普通的函数调用,故指向全局
        }
    }
}
o.getName()();//globa
function createFns(){
    var fns=[];
    for(var i=0;i<5;i++){
        fns.push(function(){
            console.log(i);
        });
    }
    return fns;
}
createFns().forEach(function(fn){
    fn();
})//5 5 5 5 5
function createFns(){
    var fns=[];
    for(var i=0;i<5;i++){
        fns.push((function(i){
            return function(){
                console.log(i);
            }
        })(i))
    }
    return fns;
}

createFns().forEach(function(fn){
    fn();
})//0 1 2 3 4 

推荐阅读更多精彩内容