函数的属性和方法this、arguments、call、apply、bind、

在这里插入图片描述
一、函数的内部属性
1.arguments:它是一个类数组对象,包含着传入函数中的所有参数。

function color(col1, col2, col3) {
	//因为是类数组对象,检测类型为object,用下标获得传入的值
	console.log(typeof arguments);// object
	console.log(arguments[0]);// red
	console.log(arguments[1]);// bule
	console.log(arguments[2]);// yellow
};
color('red', 'blue', 'yellow');

虽然arguments的主要用途是保存函数的参数,但是这个对象还有一个callee属性,接下来我们先看看callee该怎么使用

/**
这是一个阶乘函数,但是这个函数的执行和函数名take紧紧的耦合在了一起
**/
function take(num) {
	if (!num && num <= 1) {
		return 1;
	} else {
		return num * take(num - 1);
	}
}
take(6)// 720
/**
为了降低耦合,就可以使用callee
**/
function take(num) {
	if (!num && num <= 1) {
		return 1;
	} else {
		return num * arguments.callee(num - 1);
	}
}
take(6)// 720

/**
这样写就可以在函数执行的时候,函数内部就不会引用`take`函数名了,函数使用什么名字都可以。
**/
var factorial = take;
factorial(6)// 720

2.thisthis的值就是调用当前函数的环境对象

/**
因为是window环境调用了函数win所有函数内部的this指向了window
**/
function win() {
	console.log(this)
}
win()// window

/**
调用函数obj的是 o 这个对象,所以this指向了 o
**/
var o = {};
o.obj = function() {
	console.log(this)
} 
o.obj() // o

二、改变this指向的三个方法
1.call(this, str, ...)call可以接收两个或两个以上的参数,第一个参数(必填)是this要指向的对象,后面的参数是要给函数传的参数,类型不限,用逗号隔开。

var person = {
	name: 'lilei',
	age: 34,
	myFun: function (city, home) {
		console.log(this.name + '今年' + this.age + '岁' + '家住' + city + home[0])
	}
}
var  person2 = {
	name: 'hanmeimei',
	age: 26
}
person.myFun.call(person2, '上海市', ['闵行区']);//hanmeimei今年26岁家住上海市闵行区

2.apply(this, arguments) apply接收两个参数,第一个参数(必填)是this要指向的对象,第二个参数可以是一个 arguments 对象,也可以是一个实例数组。

var person = {
	name: 'lilei',
	age: 34,
	myFun: function (city, home) {
		console.log(this.name + '今年' + this.age + '岁' + '家住' + city + home)
	}
}
var  person2 = {
	name: 'hanmeimei',
	age: 26
}
/**
区别:
apply跟call的区别就是传参的方法不一样。
call()传递给函数的参数必须逐个列举出来。
apply()传递给函数的参数可以都放在数组里面
**/
person.myFun.apply(person2, ['上海', '闵行区']);//hanmeimei今年26岁家住上海闵行区

3.bind()这个方法会创建一个函数,传参的方法和call()是一样的。

var person = {
	name: 'lilei',
	age: 34,
	myFun: function (city, home) {
		console.log(this.name + '今年' + this.age + '岁' + '家住' + city + home)
	}
}
var  person2 = {
	name: 'hanmeimei',
	age: 26
}

/**
区别:
因王bind()方法返回了一个新的函数,所以调用方式和call()和apply()不一样
**/
person.myFun.bind(person2, '上海', '闵行区')();////hanmeimei今年26岁家住上海闵行区

你可能感兴趣的:(JS,arguments,call,apply,bind的区别,this,this的指向,函数的属性)