函数
- 函数声明和函数表达式
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