函数是一块javascript代码,被定义一次,就可以 执行 和 调用 多次;函数也是js对象,所以也可以像对象那样操作和传递;所以我们也把函数称之为函数对象;
一、函数声明
function a(){ //代码 }
二、函数表达式
1、自调用函数(立即执行)
(function(){ //代码 })();
2、 匿名函数表达式(将函数赋值给变量)
var a = function(){ //代码 }
3、作为返回对象
return function(){ //代码 }
三、函数构造器(不常用)
var fun = new Function(); var fun = Function(); // 这两种方法等价
1、直接调用
fun();
2、作为对象方法调用
obj.fun();
3、作为构造函数调用
new fun();
4、call/apply/bind(未开发)
func.call();
函数声明会被前置
function a(){};<-------| //相当于函数声明提前了 a(); //1 | function a(){--------->| var b = 1; console.log(b); };
函数表达式的变量会被提前
var a;<-----------------------------------------| //变量被前置 值为undefined a(); //TypeError: a is not a function | var a = function(){---------------------------->| var b = 1; console.log(b); }
函数的参数是用一个数组来表示的,可以在函数内部通过arguments对象来访问,但是arguments不是一个Array实例;
function person(name,age){ //name,age为形参 return '名字:'+name+'年龄:'+age; } person('wyang',26); //实参
如上面代码中的 name
, age
没有具体的值的,但是可以在函数体内进行一系列逻辑处理的参数就是形参,再调用函数时传入的参数如上面代码中的 wyang
, 26
是实实在在存在值的就是实参;
通过值传递参数
在函数中调用的参数是函数的参数。
如果函数修改参数的值,将不会修改参数的初始值(在函数外定义)。
函数参数的改变不会影响函数外部的变量(局部变量)。
通过对象传递参数
在JavaScript中,可以引用对象的值。
因此我们在函数内部修改对象的属性就会修改其初始的值。
修改对象属性可作用于函数外部(全局变量)。
全局中的 this
指向的是 window
,函数内的 this
也是指向 window
;
对象方法中的this指向该方法。
函数对象赋值给对象属性的时候,this指向的是该对象
var obj = { name:'wyang' } function person(){ return this.name; } obj.sayNma = person; obj.person(); //wyang
对象原型链上的this
var obj = { sayPro:function(){ return '名字:'+this.name+'年龄:'+this.age; } } var o = Object.create(obj); o.name = 'wyang'; o.age = 26; console.log(o.sayPro()); //名字:wyang年龄:26
一、在理解回调函数之前先理解下javascript里面 call()
这个方法;
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call
方法可以用来代替另一个对象调用一个方法。 call
方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj
指定的新对象。
如果没有提供 thisObj
参数,那么 Global
对象被用作 thisObj
。
上面的一堆我们用代码来简单梳理下:
function person(){ var name = 'wyang'; var age = 26; console.log(name+','+age); } function one(){ var name = 'wangyang'; var age = 27; console.log(name+','+age); } person.call(one); //wyang,26
上面的例子是 person
把 one
替换掉了。所以输出的就是 wyang
和 26
;
下面我们用 call
方法做一个继承的例子。
function person(){ this.name = 'wyang'; this.age = 26; } function one(){ person.call(this); console.log(this.name); } one(); //wyang,age
上面例子 person
本身作为对象定义一个值为 wyang
的属性 name
;然后在 one
函数里通过 call
方法把 person
的属性继承给自己。调用 one
函数输出 wyang
;
二、通过 call
方法实现的回调函数
function person(callback){ console.log(name); callback.call(this); } function one(){ var name = 'wyang'; console.log(name); } person(one); //wyang;wyang
上面例子中的 person
定义一个形参为 callback
;
通过 call
方法把形参 callback
替换掉自己;
函数 one
中命名一个变量 name
并设定值为 wyang
;
然后调用 person
函数,并把 one
函数作为参数传进去。
可以看到输出两次 wyang
;这说明在函数 person
里面接收到了 one
函数里面的 name
变量的值;
而 one
函数作为参数在 person
函数内通过 call
方法把 person
替换掉,在调用 person
函数的时候, one
函数也被成功调用,然后成功输出;
三、通过普通方式的回调
function person(callback){ console.log(name); callback(); } function one(){ var name = 'wyang'; console.log(name); } person(one); //wyang;wyang
上面例子中我们把 call
方法去掉,直接在函数 person
内部调用参数 callback
;
然后把 one
函数作为参数传递进去;
需要注意的是:javascript中的函数是对象, one
作为一个函数名是对Function对象的引用,所以在 person
函数内部调用 callback
参数时,要加‘()’;不然传递的只是一个函数名而已,并不是函数对象本身;