JavaScript Function(函数表达式)

  创建函数

  创建函数的方式有两种: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
}

  


  

上一篇:动态规划求最长公共子序列(Longest Common Subsequence, LCS)


下一篇:Ceph神坑系列