JavaScript基础知识:函数进阶(三)

JavaScript基础知识:函数进阶(一)
JavaScript基础知识:函数进阶(二)


一、函数绑定

1. 丢失 this

看个例子,如下,setTimeout 获得了函数user.sayHi,但是却丢失了上下文,并且setTimeout有些特殊,
它为函数调用设定了 == this = window==,所以 this.name ==> window.name,而全局变量中并没有 name 这个变量,所以是 undefined

let user = {
	name : 'John',
	sayHi(){
		alert(`Hello, ${this.name}`);  // Hello,
		alert(`Hello, ${user.name}`);  // Hello, John
	}
}
setTimeout(user.sayHi,1000);

那么,怎么将一个对象方法传递到别的地方,然后确保在正确的上下文中调用它呢?

有两种解决方法:

1)包装器:最简单的办法是用一个包装函数,用这个方法调整下上面的例子

let user = {
	name : 'John',
	sayHi(){
		alert(`Hello, ${this.name}`);  // Hello, John
	}
}
setTimeout(function(){
	user.sayHi();       // 成功显示名字:    Hello, John
},1000);

小问题setTimeout有1秒的延迟,若在这1秒中 **user **的值改变了的话,alert 的将是其它的结果了

2)使用 bind

语法:

let  boundFunc = func.bind(context);

继续上面的例子:

let user = {
	name : 'John',
	sayHi(){
		alert(`Hello, ${this.name}`);  // Hello, John
	}
}

let sayHi = user.sayHi.bind(user);
// 可以在没有对象的情况下使用 
sayHi();                               // Hello, John 
setTimeout(sayHi, 1000);               // Hello, John 

若对象中,有很多方法都需要传递出去的时候,我们可以:

for(let key in obj){
	if(typeOf obj[key] == 'Function'){
		obj[key] = obj[key].bind(obj);
	}
}

2. 偏函数(Partial functions)

除了可以绑定this,还可以绑定函数的 起始参数
语法:

let bound = func.bind( context,  [args1], [args2],   ...   )

使用示例:
虽然例子中并未涉及 this 的使用, 但是 bind 需要,所以需要传入 null 之类的东西

function mul(a, b){
	return a*b;
}

let double = mul.bind(null,2);

alert(double(5));   //  10

二、箭头函数

JavaScript 的精髓在于创建一个函数并将其传递到某个地方。

在这种情况下,我们当然不想丢失上下文,此时就能用上箭头函数啦。

以上内容参考于 https://zh.javascript.info/bind, 在此学习记录!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值