创建函数
创建函数的方式有两种:1、函数声明,2、函数表达式
函数声明的语法为
functionName(); //不会报错,函数声明提升
function functionName(arg0,arg1,arg2) { //do somethings; }
alert(functionName.name); //输出 functionName
也可以采用函数表达式创建函数
functionName(); //会报错,此时 functionName 仅仅是 var functionName,其值为 undefined;
var functionName = function(arg0,arg1,arg2) { //do somethings; }
alert(functionName.name); //输出 ""
递归
当一个函数可以通过名字调用自身,说明该函数为 递归函数.
function functionName() { // do somethings; return functionName(); } var another = functionName; functionName = null; another(); //报错, 因为找不到 functionName(); function functionName() { // do somethings; return arguments.callee(); //指向该函数的指针 } var another = functionName; functionName = null; another(); //不报错.
闭包
了解闭包,首先了解函数的作用域。
函数作用域里的变量,会一级级的向上查找变量,直到找到为止,找不到则报错.
var a = 1; function getA(){ alert(a); //当在当前作用域找不到变量时,会去父作用域查找该变量,直到找到为止,如果找不到,则报错. } getA(); //1;
但是,函数作用域外的变量,则访问不到函数作用域里的变量。
function setA(){ var a = 1; } setA(); alert(a); //报错.因为变量 a 不能访问到 setA 里的变量,且外部也没有 变量a
创建一个闭包函数,来访问函数里的值。
var a = 5;
function func(){ var a = 1; return { "get":function(){ alert(a); }, "set":function(num){ a=num; }, "getthis":function(){ alert(this.a); } } } var a = func(); //闭包
a.get(); //输出 1;
a.set(2);
a.get(); //输出 2;
var b = func(); //闭包
b.get(); //输出 1;
a.set(3);
b.get(); //输出 1;
a.get(); //输出 3;
由上个例子可见,闭包会造成内存占用比以前更多。因此要谨慎使用闭包。
模仿块级作用域
由于 JavaScript 没有块级作用域,会导致有些时候会出差错,得不到我们想要的结果。
function func() {
var i = 5; for (var i =0;i<10;i++) { //alert(i); } alert(i); //输出10; 并不是我们想要的10; }
因此 可以利用 立刻执行的匿名函数,来模拟块级作用域。
function func() { var i = 5; (function(){ for (var i = 1;i < 10;i++) { //alert(i); } }()); alert(i); //输出 5 }