1,函数声明function functionName(arg0,agr1,arg2){} 在firefox,safari,chrome中通过name属性返回函数名
2,函数声明提升,可以把函数声明放在调用它的语句后面
3,函数表达式:var functionName = function(arg0,arg1,arg2){};不被提升,必须放在调用它的语句前面
一,递归
1,argument.callee是一个指向正在执行的函数的指针,在函数名改变的情况下,使用argument.calleee代替函数名实现函数的递归调用
二,闭包
function f1(){ var n = 10000; function f2(){ 访问到n可以操作n; } return f2; }
1,闭包与变量
function f1(){ var n = 10000; function f2(){ 访问到n可以操作n; } return f2; }
2,关于this对象
全局环境中,this等于window,当函数被作为方法是用时,this指向这个对象
var name = "the window"; var object = { name:"my Object", getNameFunc:function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()()); 返回the window
将外部函数的this对象保存在闭包能够访问到的变量里
var name = "the window";
var object = { name:"my Object", getNameFunc:function(){ var that = this; return function(){ return that.name; } }; }; alert(object.getNameFunc()()); 返回my object
使用argument有同样的问题,所以要想访问作用域中的argument对象,必须将该对象的引用保存在另个闭包能够访问到的变量中
3,内存泄露
闭包会引用包含函数的整个活动对象,最好在外部函数中定义闭包能直接访问的变量,闭包结束后释放变量,减少引用数
函数返回了一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止
三,模仿块级作用域
1,for循环语句中定义的变量,可以在for循环外部访问到
2,js不会响应是否多次声明了同一个变量,忽略后面的声明但是不会忽略后续中的初始化
3,用作块级作用域的(私有作用域)的匿名函数的语法:(function(){//这里是块级作用域})();
4,函数声明后面不能加(),函数表达式后面可以加();
5,匿名函数中定义的任何变量在结束后都会消失
6,()();可以减少闭包占用的内存问题,只要函数执行完毕,就立即销毁其作用域链了
四,私有变量
有权访问私有变量和私有函数的共有方法称为特权方法
function(){ //私有变量和私有函数 var privateFunction = 10; function privateFunction(){ return false; } //特权方法 this.publicMethod = function(){ privateVariable++; return privateFunction(); } }
1,静态私有变量
(function(){ //私有变量和私有函数 var privateVariable = 10; function PrivateFunction(){return false;} //构造函数(使用函数表达式方式实现) MyObject = function(){}; //共有特权方法,在构造函数原型上实现 MyObject.prototype.publicMethod = function(){privateVariable ++;return privateFunction();}; })();
2,模块模式
1)创建单例对象,以对象字面量的方式来创建
(function(){ //私有变量和私有函数 var privateVariable = 10; function PrivateFunction(){return false;} //构造函数(使用函数表达式方式实现) MyObject = function(){}; //共有特权方法,在构造函数原型上实现 MyObject.prototype.publicMethod = function(){privateVariable ++;return privateFunction();}; })();
2)模块模式为单例添加私有变量和特权方法使其得到增强
var singleton = function(){ //私有变量和私有函数 var privateVariable = 10; function privateFunction(){return false;} //特权共有方法 return{ publicProperty:true, publicMethod:function(){ privateVariable ++; return privateFunction(); } }; }();
3,增强的模块模式
指定单例必须是某种类型的实例时
var singleton = function(){ //私有函数和私有变量 var privateVariable = 10; function privateFunction(){return false;} //创建特定类型的对象实例 var object = new CustomType(); //添加特权共有属性和方法 object.publicProperty = true; object.publicMethod = function(privateVariable ++;return privateFunction();){}; //返回这个对象 return object; }();