bind、call、aplay改变函数中的this

一:bind函数(改变函数的this指向并返回一个新的函数,不会调用函数而是将函数复制一份。这是与其他两个不同的地方)

function fn (){
	console.log(this)
	console.log(x + y)
}
var o = {
	name :'zs'
}
var f = fn.bind(o,1,3)//bind函数返回一个新的函数,fn是原有的函数,bind的第一个参数是this要指向的新的对象,后面是要给函数fn传递的参数
f();// bind不能自调用,需要手动调用
bind应用

bind函数不会去调用函数

var obj = {
	name:'zs',
	fn : function() {
			setInterval(function(){
				console.log(this.name)
			},1000)
	}
}
obj.fn();// 定时器里面的this指向的是window所以打印是空。我们想打印的是obj中的name值。所以可以修改为:
var obj = {
	name:'zs',
	fn : function() {
			setInterval(function(){
				console.log(this.name)
			}.bind(this),1000)
			// 这里的this是Obj调用的,this就指向obj。bind就是来改变函数内部的this指向的,所以改变后定时器中的this就指向obj中的name
	}
}
obj.fn()

二:call() 改变函数中的this,并直接调用函数

call 理解为呼叫。直接调用

// 1.调用函数,改变函数中的this
// 2. 第一个参数 设置函数内部this的指向
//      其他参数,对应函数的参数
// 3.函数的返回值。call的返回值就是函数的返回值
// 4. 测试
function fn(x,y){
	console.log(this)
	console.log(x + y)	
}
var o = {
	name :'zs'
}
fn.call(o,1,3)
call的应用

自己创建一个伪数组,让其拥有真正的数组中的某个方法。(使用call()改变this指向)

三:aplay 改变函数中的this,并直接调用函数,只有2个参数

// 1.调用函数,改变函数中的this
// 2. 第一个参数 设置函数内部this的指向
//     第二个参数是一个数组,数组的第一项是参数一,第二项是参数二
// 3.函数的返回值。call的返回值就是函数的返回值
// 4. 测试
fn.aplay(obj,[1,3])
apply的应用

常见的应用就是把后面的数组展开传递给前面的函数。例如求数组中的最大值
应用一:
第二个参数是一个数组,他可以把数组中的值展开成一个一个的。所以可以应用到:

var arr = [ 5,10,1,3,6 ]
// 数组中是没有max这个自带的原始的方法的,所以使用apply函数继承Math对象中的max方法,让数组也有这个方法
console.log(Math.max.apply(null,arr))// 我们不需要改变this的指向。所以我们也可以给传递他原来的this对象
console.log(Math.max.apply(Math,arr))
// 有了这种方式我们也不需要自己手写一个函数来求最大值了

应用二:

console.log(1,2,3)// 1 2 3// 这是打印的结果。需求:我们现在想让传递一个数组也用这种形式打印出来
var arr = [ 5,10,1,3,6 ]
console.log.apply(console,arr)

函数中的其他成员

function fn(){
	console.log(arguments)// 和fn.arguments作用一样。当函数的参数不固定个数的时候,使用arguments来获取
	console.log(fn.arguments)// 是一个伪数组,获取函数传递过来的实参,即使没有形参来接收
	console.log(fn.caller)//函数的调用者。全局下返回的是null
	console.log(fn.name)// 函数的名称
	console.log(fn.length)// 函数的形参个数
}
fn(1,3,9)

高阶函数

  • 函数作为参数
  • 函数作为返回值

函数作为参数

数组的sort排序原理(冒泡排序)

Array.prototype.mySort = function (fn) {
	for( var i = 0;i < this.length - 1; i++ ){
		var isSort = false
		for( j = 0 ; j < this.length - 1; j++ ){
				if( fn(this[j] , this[j + 1]) > 0 ){
					isSort = false
					var tmp = this[j];
					this[j] = this[j + 1]
					this[j + 1] = tmp
				}
		}
		if(isSort){
			break;
		}
	}
}
var arr = [35,1,6,20];
arr.mySort(function(a,b){
	return a - b
})

函数作为返回值(容易产生闭包,具体看闭包章节文章)

需求:写一个函数,产生1-10之间的随机函数。第一次调用生成随机数,以后每次调用都返回第一次的随机值
function getRandom(){
	var random = parseInt(Math.getRandom() * 10) + 1
	return function(){
		return random 
	}
}
var fn = getRandom()
console.log(fn())
console.log(fn())
console.log(fn())// 每一次的刷新,这三个值都是一样的
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值