javascript中的函数对象的call和apply方法,及this指向总结

Posted 江州益彤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript中的函数对象的call和apply方法,及this指向总结相关的知识,希望对你有一定的参考价值。

call()和apply()

这两个方法都是函数对象的方法,需要通过函数对象来调用;
当对函数调用call()和apply()都会调用函数执行

function fun() {
	console.log("调用fun方法");
}
fun();			//会调用fun方法
fun.call();		//也会调用fun方法
fun.apply();	//也会调用fun方法

在调用call()和apply()可以将一个对象指定为第一个参数

此时这个对象将会成为函数执行时的this

function fun() {
	console.log(this);
}

var obj={name:'wangermao'}

fun();
fun.call(obj);		
fun.apply(obj);

在这里插入图片描述
再看

var name="hello";
			
function fun() {
	var name="world";
	console.log(this);
	console.log(this.name);
}

var obj={name:'王二毛'}
var obj2={name:'三毛'}

fun();
fun.call(obj);		
fun.apply(obj2);

在这里插入图片描述

call()方法可以将实参在对象之后依次传递

function fun(a,b) {
	console.log("a=",a);
	console.log("b=",b);
}

var obj = {
	name: '王二毛',
	sayName: function() {
		console.log(this.name);
	}
}

fun.call(obj,2,3);

在这里插入图片描述

apply()方法需要将实参封装到一个数组中统一传递

function fun(a,b) {
	console.log("a=",a);
	console.log("b=",b);
}

var obj = {
	name: '王二毛',
	sayName: function() {
		console.log(this.name);
	}
}

fun.apply(obj,[4,5]);//apply()方法需要将实参封装到一个数组中统一传递

在这里插入图片描述

this的情况:

	 * 		1.以函数形式调用时,this永远都是window
	 * 		2.以方法的形式调用时,this是调用方法的对象
	 * 		3.以构造函数的形式调用时,this是新创建的那个对象
	 * 		4.使用call和apply调用时,this是指定的那个对象

面试题

var ctx = {
	_val: 30
};
var _val = 10;

function rootFn() {
	console.log(this._val); //以对象形式调用,this指向该对象

	function childFn() {
		this._val = 20;
		console.log(this._val);
	}
	return childFn; //以函数形式调用,this指向window
}

rootFn.apply(ctx)();
console.log(ctx._val);

//30
//20
//30
var ctx = {
	_val: 30
};
var _val = 10;

function rootFn() {
	console.log(this._val); //以对象形式调用,this指向该对象
	this._val = 20;

	function childFn() {
		console.log(this._val);
	}
	return childFn; //以函数形式调用,this指向window
}

rootFn.apply(ctx)();
console.log(ctx._val);

//30
//10
//20

以上是关于javascript中的函数对象的call和apply方法,及this指向总结的主要内容,如果未能解决你的问题,请参考以下文章

函数的call()方法和apply()方法

JavaScript中的apply()call()bind()

javascript 中的callapplybind

javascript 中的callapplybind

javascript中的apply与call

JavaScript中的call()apply()与bind():