JavaScript 函数表达式

函数定义

1
2
3
4
// 函数声明  关键字function  函数名  参数
function functionName (arg0, arg1, arg2) {
// 函数体
};

函数声明,特性:函数声明提升,就是说执行代码之前会先读取函数声明。举个例子

1
2
3
4
5
6
// 调用函数
sayHi();
// 定义函数
function sayHi(){

};
1
2
// 函数表达式
var functuinName = function(arg0, arg1, arg2) {}

递归

递归函数是在函数通过名字调用自身的情况下构成的。

1
2
3
4
5
6
7
function factorial(num){
if (num <= 1) {
return 1;
} else {
return num * factorial(num - 1);
}
}

闭包

JavaScript 变量可以是局部变量或全局变量。
私有变量可以用到闭包。

1
2
3
4
5
6
function createFunction (name){
return function(object1) {
var value1 = object1(name)
alert(value1)
}
}

this对象

this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。

1
2
3
4
5
6
7
8
9
10
11
12
var name = "The Window";
var object = {
name: "My object",
getNameFunc: function() {
var that = this; // 将getNameFunc()的this保存在that变量中
var age = 15;
return function() {
return that.name;
};
}
}
alert(object.getNameFunc()()); // "My object"

内存泄漏

  1. 闭包中引用变量消除循环引用
  2. 把element变量设置为null,这样能够解除对DOM对象的引用,顺利地减少其引用数,确保正常回收其占用的内存。

模仿块级作用域

1
2
3
4
5
6
7
(function(){
for (var i = 0; i < count; i++) {
alert(i)
}
var i;
alert(i)
})();

私有变量

特权方法,有权访问私有变量和私有函数的公有方法称为特权方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function MyObject(){
// 私有变量和私有函数
var privateVariable = 10;

function privateFunction () {
return false;
}

// 特权方法
this.publicMethod = function () {
privateVariable++;
return privateFunction();
}
}

静态私有变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(function(){
// 私有变量和私有函数
var privateVariable = 10;

function privateFunction () {
return false;
}

// 特权方法
this.publicMethod = function () {
privateVariable++;
return privateFunction();
}
})()

模块模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var singleton = function () {
// 私有变量和私有函数
var privateVariable = 10;

function privateFunction(){}

var object = new CustomType()

// 添加特权方法/公有属性和方法
object.publicProperty = true;

object.publicMethod = function () {
privateVariable++;
return privateFunction();
}

return object
}();