定义函数的方式有两种:函数表达式和函数声明
函数声明:
sayHi();//放前面放后面都行,因为函数声明提升(就是说函数之前已经声明过了)
function sayHi(){
alert("Hi");
}
函数表达式:
var sayHi=function(){
alert("Hi");
}
sayHi();
禁忌写法:
if(true){
function sayHi(){
alert("Hi");
}
}else{
function sayHello(){
alert("Hello");
}
}
递归:
自己调用自己
function factorial(num){
if(num<=1){
return 1;}else{
return num *factorial(num-1);
}
}
上面的递归虽然经典,但是却避免不了空指针的问题。下面的方法可以解决:
function factorial(num){
if(num<=1){
return 1;}else{
return num *arguments.callee(num-1);
}
}
or
var factorial=(function f(){
if(num<=1){
return 1;}else{
return num *f(num-1);
}
});
闭包:
闭包就是一个函数里面创建了另一个匿名函数!!!
创建了函数,当函数被调用的那一刻起,会创建一个执行环境,并且对应了一个作用域链,当你给arguments数组对象里的元素形参赋值的那一刻,实际上就创建了这个函数的活动对象,活动对象在作用域链中是有位置的,匿名函数的活动对象在作用域链的位置排在第二位,大函数的活动对象位置是在第三位。
function big(val)//大函数
{
return function(obj1,obj2)//匿名函数
{
num1=obj1[val];
num2=obj2[val];
num1[val]
if(num1<num2){
return -1;
}else if(num1>num2){
return 1;
}else{
return 0;
}
}
}
var result=big(5,10);
result和big(val);这两个就是全局变量对象,作用域链的本质既是一个指向变量对象的指针列表,他只引用但不包含变量对象。
匿名函数调用:
var func1=function(){
console.log("匿名函数");
}
func1();
可以简写成这样:
(function(){
console.log("匿名函数");
})()
上面的也会立刻调用!!!
这种写法会在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数,这种方法也叫做私有作用域,执行过后立即销毁!!!
私有变量:
function Person(){
var privateName="simalinjia";
function privatedo(){
return false;
}
this.publicMethod=function(){//通过这个匿名的闭包函数,将私有属性暴露出去
privateName="hello";
return privatedo();
}
}