二 函数
1.函数
函数是一个对象,存储在堆中。
2.函数的创建
- (1)function fn1(参数1,参数2...){ 函数的语句块; } fn1(参数1,参数2...);
①函数是一个对象,这种普通函数创建,在script被执行时,就放入堆中并且在栈中以函数名作为变量引用堆中这个函数地址。
②函数在创建时,就创建了这个函数名的变量,因为这个变量是全局的,所以会被覆盖。但,覆盖前,仍然可以执行当前函数;覆盖后,函数就不能执行了。
③如果函数中没有使用return关键字,函数返回一个undefined值。
④console.dir(函数);可以将函数对象以函数的形式展现。
⑤函数是对象,因此具备引用关系。
-
(2)匿名函数创建 var fn2 = function(){ 函数的语句块; } ①匿名函数创建,创建好的匿名函数赋值给fn2这个变量。 ②变量什么时候定义,这个变量才什么时候在栈中产生,函数才会被调用。
-
(3)自执行函数 (function(){ })() 会自动执行,以后永远不能再调用。
-
(4)构造函数创建函数 var fn = new Function("参数1","参数2"...,"函数语句块"); ①构造函数创建,每个参数都必须是字符串。 ②除了最后一个参数是函数的语句块以外,前面所有的参数都是该函数的参数。
3.函数的参数
- (1)参数:创建函数时,在函数后面括号中填写的变量叫作参数。
- (2)函数如果没有参数,函数的处理是不能变化的,参数的目的就是解决函数在不同情况下解决不同问题。
- (3)在设计函数时,尽量不要让函数内部与外部有关联,尽量让函数内部是一个独立的个体。(抽象)
- (4)在JS中,因为js是一种弱类型语言,因此不能对参数约束其类型,这就会造成:因为使用函数者输入的参数不符合需求而造成代码出错,造成白盒测试出错。
- (5)ES5版本,JS中参数不能设置初始值,不填写参数就是undefined。
- (6)函数定义时的参数叫作形参,执行时填入的参数是实参,实参是按照形参顺序一一赋值给形参。 如果实参数量小于形参数量,后面的形参值就是undefined。
- (7)argument.length:实参的长度;函数名.length:形参的长度。
arguments的使用
①当实参数量大于形参数量时,使用arguments。输入的实参保存在arguments中。
②arguments只能出现在函数语句块中。
③用于当前函数的参数不固定数量时。
④arguments.callee 当前函数
arguments.callee.name 当前函数的名字
arguments.callee.caller 调用当前函数的外部函数
4.变量作用域
- (1)变量只能在局部中使用,叫作局部变量; ①局部变量:被定义在函数内部的变量,使用范围仅在函数内部,并且当前函数执行完成后,这个变量会被销毁,下次这个函数在执行时,会重新定义这个变量,并且变量在函数执行完成后不能被使用。 ②局部变量优先。 ③如果当前函数没有定义局部变量,则直接调用全局变量。 ④如果局部变量只定义变量没有赋值,仍然遵从局部变量优先原则,此时变量为undefined。 ⑤在函数中,只要看到var定义的变量,这个变量一定是局部变量,而且这个变量优先使用。 ⑥当函数中设置了参数,这个参数相当于var定义好的局部变量。 ⑦因为参数本身就是局部变量,所以重新定义不赋值时不起作用。
- (2)变量在任何地方都可以使用,叫作全局变量。
5.清除函数
函数名=null;
delete不能删除window下任何方法。
6.return
- (1)函数在执行时,将返回函数中retur内容。
- (2)如果return后没有内容或者没有return,返回一个undefined;
- (3)函数返回的作用: ①返回局部变量 ②返回参数 ③跳出,切达,不继续执行
- (4)函数执行到内部其他函数时,内部函数中的内容全部执行完成后,再执行外部函数其他内容。
- (5)当需要并列执行多个时,我们可以在一个函数中统一调配执行的顺序。
三 回调和递归
1.回调
- (1)含义:将一个函数以参数的形式传入到另一个函数中,并且在那个函数中执行。
- (2)用处: ①回调一般用于当处理某件事情需要等待时,设置回调。 ②当不需要关心具体后续需要处理的事情时,设置回调。
setTimeout方法:
时间间隔函数:setTimeout(超时执行的函数,超时时间,执行函数的参数) 返回一个ID数。
var id = setTimeout(fn,2000,5);
将函数异步处理。(一定时间后处理问题)
clearTimeout(id);清除时间间隔函数。
setInterval方法:
setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。
2.递归
(1)含义:函数内执行当前自身函数。