js中的四种函数调用模式

首先的说明什么是函数,而什么又是和它长的巨像的方法。
函数:如果一个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的功能是一样的,只是传入的参数列表形式不同。

菜鸟爬行中…

猜你喜欢

转载自blog.csdn.net/h1234561234561/article/details/86532514