首先的说明什么是函数,而什么又是和它长的巨像的方法。
函数:如果一个function能被任何对象使用,则称其为函数。
方法:如果一个function是作为一个对象的属性存在,那就称为方法。
代码示例:
</head>
<body>
<button onclick="add()">函数</button>
<button onclick="myobject.value()">方法</button>
</body>
<script>
//函数
function add(){
alert("I am a function!");
}
//方法
var myobject={
value:function(){
alert("I am a way!");
}
}
</script>
运行截图:
然后四种具体的函数调用方式
一,函数调用
代码示例:
<style>
button{
margin-left: 20px;
}
</style>
</head>
<body>
<button onclick="add(1,3)">函数调用</button>
<!-- <button onclick="myway.way()">方法调用</button> -->
</body>
<script>
var a=6;
var add=function(a,b){
alert(this);
alert(this.a);
alert(a+b);
}
运行截图:
值得注意的是这里的this
指向的是全局window
,所以上述代码示例alert(this.a);
会是6而不是1。
二,方法调用
代码示例:
<style>
button{
margin-left: 20px;
}
</style>
</head>
<body>
<!-- <button onclick="add(1,3)">函数调用</button> -->
<button onclick="myway.way()">方法调用</button>
</body>
<script>
var value=1;
var myway={
value:0,
way:function(){
alert(this);
alert(this.value);
}
}
运行截图:
在这里就不是函数了,而是某个对象里面的属性方法了,所以this
指向的是局部object
,所以上述示例弹出的是0而不是1。
此外:记住每次属性结尾符号为,
而不是;
否则报错。
三,函数重构
代码示例:
<style>
button {
margin-left: 20px;
}
</style>
</head>
<body>
<button onclick="Onclik()">函数重构</button>
<!-- <button onclick="myway.way()">方法调用</button> -->
</body>
<script>
//类同java里面的构造函数:函数名与相同,无返回值;
//作用:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法。
var Dog=function(name, sex, color) {
this.name = name;
this.sex = sex;
this.color = color;
alert(this);
}
Dog.prototype.toString = function dogtoString() {
var ret = "This is a named " + this.name + " " + this.color + " " + this.sex + " dog";
return ret;
}
var dog = new Dog("jack", "female", "black");
var Onclik=function(){
document.write(dog.toString());
}
这里是改写了js中自带的object类型中的.toString()函数同样重要的是这里的this
是原始指向的是全局window
如下示例;但是在上例中this.name = name;
的重定位导致指向是构造函数本身即object`。
示例:
<button onclick="Dog(1,1,1)">函数重构</button>
<!-- <button onclick="myway.way()">方法调用</button> -->
</body>
<script>
var Dog=function(name, sex, color) {
alert(this);
}
四,apply/call的应用
首先得说明下什么事apply,什么是call.
apply在js中的语法
/*apply()方法*/
function.apply(thisObj[, argArray])
字面意思可知:函数function应用于这个对象thisObj,参数为数组[,]
1,普通用法:
<body>
<button onclick="Onclik()">apply/call</button>
<!-- <button onclick="myway.way()">方法调用</button> -->
</body>
<script>
var add=function(a,b){
return a+b;
}
var sub=function(a,b){
return a-b;
}
var Onclik=function(){
alert(add.apply(sub,[1,2]));
}
运行截图:
由示例可知add函数应用于sub减法对象中,参数为[1,2]。
2,继承用法:
<body>
<button onclick="Onclik()">apply/call</button>
</body>
<script>
var Dog=function(leg){
this.leg=leg;
}
var jack=function(name,sex){
Dog.apply(this,[4]);
this.name=name;
this.sex=sex;
}
jack.prototype.toString=function(){
return("This is a named "+this.name+" has "+this.leg+" leg "+" "+this.sex+" dog!")
}
var Jack=new jack("jack","female");
var Onclik=function(){
document.write(Jack.toString());
}
运行截图:
3,灵活调用其他函数【js自带函数和自我定义函数】
求最大值:
<body>
<button onclick="Max()">apply/call</button>
</body>
<script>
var arr1=new Array("3","5","2","6","1","7");
var Max=function(){
alert(Math.max.apply(this,arr1));
}
解释:Math.max()函数应用于这个对象,参数为数组arr1
数组合并:
<body>
<button onclick="Max()">apply/call</button>
</body>
<script>
var arr1=new Array("1","2","3","4","5","6");
var arr2=new Array("7","8","9","10","11","12");
var Max=function(){
alert(Array.prototype.push.apply(arr1,arr2));
document.write(arr1[11]);
}
解释:push()返回的是合并后的数组arr1的长度。
call在js中的语法
/*call()方法*/
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);
用法与apply类同。
总的来说:
它们各自的定义:
apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。
call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。
它们的共同之处:
都“可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象”。
它们的不同之处:
apply:最多只能有两个参数——新this对象和一个数组argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里。如果argArray不是一个有效的数组或arguments对象,那么将导致一个TypeError。如果没有提供argArray和thisObj任何一个参数,那么Global对象将被用作thisObj,并且无法被传递任何参数。
call:它可以接受多个参数,第一个参数与apply一样,后面则是一串参数列表。这个方法主要用在js对象各方法相互调用的时候,使当前this实例指针保持一致,或者在特殊情况下需要改变this指针。如果没有提供thisObj参数,那么 Global 对象被用作thisObj。
实际上,apply和call的功能是一样的,只是传入的参数列表形式不同。
菜鸟爬行中…