JavaScript中变量可以分为两类:基本类型和引用类型(有时也称对象)。其中数值、字符串、布尔值、null和undefined属于基本类型;对象、数组和函数属于引用类型(对象)。 基本类型在内存中具有固定的内存大小。例如:数值型在内存中占有八个字节,布尔值只占有一个字节。对于引用型数据,他们可以具有任意长度,因此他们的内存大小是不定的,因此变量中存储的实际上是对此数据的引用,通常是内存地址或者指针,通过它们我们可以找到这个数据。
在ECMAScript中,函数是对象,每个具体函数都是Function对象的实例。函数可以作为变量来使用,变量名作为指向函数的指针来使用。
函数声明法:
function functionname(){···} //没分号
函数表达式:
var x = function(){···}; //有分号
注1:函数可以没有函数名,如function(){}; 被称为匿名函数。可以运行,在onclick中常用。但是没有办法被再次引用,没有名字嘛,就没有指向这个函数的指针。
注2:在函数表达式中,将函数赋给变量x,x保存的是函数指针。与函数声明中的functionname是一样的。
注3:在JavaScript中,函数定义里可以嵌套函数定义。而这在C语言中是不允许的。
例如1:
function Func1(){ ···· function Func2(){ ··· } } // 当调用函数: Func1(); 的时候, Func2() 是不执行的。因为在 Func1() 里,只是定义了 Func2 。例如2:
function Func1(){ var num=0; return function(){ return num; }; } alert(Func1()); //结果显示:function(){return num;} alert(Func1()()); //结果显示:0 注 4 :函数声明与函数表达式的区别只有一点:函数声明可以函数声明提升,意思就是在执行代码前先读取函数声明。例如: sayHi(); //没有问题 function sayHi(){···} sayHi(); //错误,函数还不存在 var sayHi = function(){···};
在保存函数参数的对象arguments中有一个名叫callee的属性,该属性是一个指针,指向函数。等同于函数名。
//在递归函数中,函数通过函数名调用自身: function multiple(num){ if(num<=1){ return 1; }else{ return num*multiple(num-1); } } //因为在函数中用来multiple这个函数名,当: var a = multiple; multiple = null; a(4); //出错。 //为了消除这种紧密耦合的现象,可以: function multiple(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } } //缺点:在严格模式下,不能使用arguments.callee,解决方法: var multiple = (function f(num){ if(num<=1){ return 1; }else{ return num*f(num-1); } }); //解释:这是模仿块级作用域。
解决方法:将代码放在一个函数中。
方法1:
function mymodule(){
···一段代码
}
mymodule(); //不要忘了调用函数
方法2:推荐
( function(){
···一段代码
} ) ()
理解:
用函数表达式时,var x=function(){}; x(); 将function(){···}看成x,()防止JavaScript将function关键字作为函数声明的开始。
方法3:
( function(){
···一段代码
} () )
理解:
()表示立即执行,()防止JavaScript将function关键字作为函数声明的开始。