1.定义函数的方式:
①函数声明(其重要特征是函数声明提升,可以把函数声明放在调用它的语句后面):
function functionName ( arg0, arg1, arg2 ){
// 函数体
}
②函数表达式:
var functionName = function ( arg0, arg1, arg2 ){
// 函数体
}
2.匿名函数:function关键字后面没有标识符
3.闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。闭包只能取得包含函数中任何变量的最后的一个值。过度使用闭包可能会导致内存占用过多
4.但某个函数被调用时,会创建一个执行环境及相应的作用域链;在另一个函数内部定义的函数会将外部函数的活动对象添加到它的作用域链中。作用域链本质上是一个指向变量对象的指针列表,它只引用但不实际包含变量对象。
5.一般来讲,当函数执行完毕后,局部活动对象就会被销毁,内存中仅保存全局作用域(全局执行环境的变量对象)
6.this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。匿名函数的执行环境具有全局性,因此其this对象指向window
7.如果闭包的作用域链中保存着一个HTML元素,那么就意味着该元素将无法被销毁
8.特权方法:有权访问私有变量和私有函数的公有方法称为特权方法。
9.创建特权方法的方式:
①在构造函数中定义特权方法
function MyObject (){
// 私有变量和私有函数
var privateVariable = 10 ;
function privateFunction (){
return false ;
}
// 特权方法
this . publicMethod = function (){
privateVarible++;
return privateFunction () ;
};
}
②在私有作用域中定义私有变量或函数
( function (){
// 私有变量和私有函数
var privateVariable = 10 ;
function privateFunction (){
return false;
}
// 构造函数
MyObject = function(){};
MyObject . prototype . publicMethod = function (){
privateVariable ++;
return privateFunction () ;
};
}) () ;
③模块模式:为单例创建私有变量和特权方法
var singleton = function (){
var privateVariable = 10;
function privateFunction (){
return false;
}
return {
publicProperty : true ,
publicMethod : function (){
privateVariable ++;
r
}
}
}
10.单例:只有一个实例的对象。JavaScript是以对象字面量的方式来创建单例对象的
11.递归函数应该始终使用arguments.calee 来递归地调用自身,不要使用函数名——函数名可能会发生变化