/* 来源具体可查看《JavaScript模式》 */
一、函数特点
1、函数时第一类对象
- 函数在运行时动态创建,还可以在程序执行过程中创建
- 函数可以分配给变量,可以将它们的引用复制到其他变量,可以被扩展,此外,除少数情况外,函数还可以删除
- 可以作为参数传递给其他函数,并且还可以由其他函数返回
- 函数可以有自己的属性和方法
2、函数提供了作用域
在函数内部以var
关键字定义的任何变量都是局部变量,对于外部函数是不可见的。(需注意对于if和for来说,并不意味着也是局部变量)
二、函数的定义
1、命名函数表达式
var add=function add(a,b) {
return a + b;
};
2、函数表达式,又称匿名表达式
var add=function (a,b) {
return a + b;
};
3、函数声明
function add(a,b) {
return a + b;
}
三、函数的提升
函数声明与命名函数表达式或者匿名函数的区别在于提升行为。
函数声明被提升到了函数顶部(a函数整体),而表达式b,仅提升了var b;
可参考 函数的预解析和逐行解读
function test() {
console.log(typeof a); //function
console.log(typeof b); //undefind
a(); //'我被弹出'
b(); //' b is not a function '
function a() {
alert('我被弹出');
}
var b=function () {
alert('我没有弹出')
}
}
test();
四、函数相关的模式
1、回调模式。
函数都是对象,因此它们可以作为参数传递给其他函数。
function getResult() {
//获取到一些值
}
function doSth(callback) {
callback();
//do something
}
doSth(getResult)
2、返回函数
var steup = function () {
var count = 0;
return function () {
return (count += 1)
};
};
var next=steup();
next(); //1
next(); //2
next(); //3
steup()包装了返回函数,创建了一个闭包,可以使用这个闭包存储一些私有数据,而这些数据仅可被该返回函数访问,但外部代码无法访问。
3、自定义函数(惰性函数)
函数可以动态定义,也可以分配给变量。
var scareMe = function () {
alert('逗');
scareMe=function () {
alert('逗b欢乐多')
};
};
scareMe(); //'逗'
scareMe(); //'逗b欢乐多'
scareMe(); //'逗b欢乐多'
scareMe(); //'逗b欢乐多'
scareMe(); //'逗b欢乐多'
当函数有一些初始化准备工作要做,并且仅需要执行一次,这种模式函数很有用的。
4、即时函数(自调用)
语法:
(function () {
alert('hello');
}());
(function () {
alert('hello');
})();
即时函数的返回值
1、具体的值
var result=(function () {
return 2+2;
}())
2、任意的值
var result=(function () {
var res= ?; //获取需要的值;
return function () {
return res;
};
}())
优点:
定义的所有这些变量将会是用于自调用函数的局部变量,并且不用担心全局空间被临时变量所污染。
/待完善/