js之call、apply、bind与this

call:指定this的指向,也就是地址的指向。返回值是执行后的结果。

一、空、undefined、null中this全部指向的window;其他情况则指向它本身,不是对象的转换为对象。而且call绑定时是立即执行函数的。
let obj = {
	eat(){
		console.log("吃八方财")
		console.log(this);
	}
}

obj.eat.call()  // window
obj.eat.call(undefined)  // window
obj.eat.call(null)  // window

在这里插入图片描述

指向它本身,不是对象的转换为对象。

	function fn(){
			console.log(this);
		}
		let obj = {}	
		// fn.apply() //win
		// fn.apply(null) //win
		// fn.apply(undefined) //win
		
		//指向它本身,不是对象的转换为对象。
		// fn.apply('222') //String{'222'}		
		// fn.apply([]) //[ ]
		// fn.apply({}) //{ }
		// fn.apply(NaN) //Number{NaN}
		// fn.apply(111) //Number{111}
		// fn.apply(function(name,age){}) // ƒ (name,age){}
		fn.apply(Object) // ƒ Object() { [native code] }

二、call中的this总是指向调用函数的对象。

例如:

let obj = {
	eat(){
		console.log("吃八方财")
	}
}

function fn(){
	console.log(this); //window
	obj.eat.call(this)  // window
}
fn() // window.fn()

未创建实例,则this指向window

let obj = {
	eat(){
		console.log("吃八方财")
	}
}

function fn(){
	console.log(this); // ff
	obj.eat.call(this)  // ff
}
let ff = new fn()
ff.fn()

创建实例,则this指向实例对象。

apply与call用法相同,唯一的不同是参数书写方式不同;apply的参数是数组形式,而call的参数形式是一个一个的。

obj.eat.call(undefined, 1, 'name', 3)
obj.eat.apply(undefined, [ 1, 'name', 3 ])
三、bind绑定的函数不立即执行,需要加括号才执行。this和参数的形式与call一样,参数是一个一个的。
let obj = {
	eat(){
		console.log("吃八方财")
	}
}

function fn(name,age){
	console.log(name , age);
}
fn.bind(obj, 'xiaohong', 18)

在这里插入图片描述
不加括号其实返回的是绑定的函数。
如果加上括号就会立即执行:

fn.bind(obj, 'xiaohong', 18)()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值