博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
修改this指向(bind、call 和 apply)
阅读量:6241 次
发布时间:2019-06-22

本文共 2718 字,大约阅读时间需要 9 分钟。

hot3.png

一、bind

bind 的其中一个用法就是:绑定函数,使其无论怎么样调用都用相同的 this

示例:

var obj = {    getThis: function() {        console.log(this);    }};obj.getThis();var getThisCopy = obj.getThis;getThisCopy();

运行结果如下:

通过上述例子我们会发现,虽然是 getThisCopy 是复制了 obj 的 getThis 方法,但是他们所属的对象却不一样。在对象里面,所有的 this 都指向对象本身,而在全局作用域定义的变量的 this 指向 Window。

示例:

var obj = {    num: 100,    numFun: function() {        console.log(this.num);    }};var numFunCopy = obj.numFun;numFunCopy();

运行结果如下:

原因:复制了函数numFun,但是没有复制num属性,导致后面调用numFunCopy的时候,num是未定义的

bind 的存在就是 为了解决 this 不能够指向原来的问题。

所以,试试这段代码:

var obj = {	getThis: function(){		console.log(this);	}}var getThisCopy = obj.getThis;obj.getThis();		getThisCopy.bind(obj)();	var obj = {	num: 100,	numFun: function(){		console.log(this.num);	}}var numFunCopy = obj.numFun;obj.numFun();numFunCopy.bind(obj)();

输出结果如下:

总结:

总结bind使用方法:

fun.bind(thisArgument, argument1, argument2, ...)

thisArgument:在 fun 函数运行时指定的 this 值,如果绑定函数时使用 new 运算符构造的,则该值将被忽略。

argument1, argument2, ...:指定的参数列表。

返回值:具有指定 this 值和初始参数的给定函数的副本

使用1:创建绑定函数,使函数无论怎么样调用,都有相同的 this 值

this.x = 9; var module = {  	x: 81,  	getX: function() { return this.x; }};module.getX(); // 返回 81var retrieveX = module.getX;retrieveX(); // 返回 9, 在这种情况下,"this"指向全局作用域// 创建一个新函数,将"this"绑定到module对象// 新手可能会被全局的x变量和module里的属性x所迷惑var boundGetX = retrieveX.bind(module);boundGetX(); // 返回 81

 

二、call

语法:fun.call(thisArgument, argument1, argument2, ...)

thisArgument:在 fun 函数运行时指定的 this 值。在非严格模式下,该函数 this 指定为 null 和 undefined ,则 this 值会自动只想全局对象,同时只为原始值的 this 会指向该原始值的自动包装对象。

argument*:指定的参数列表。

返回值:调用该方法的返回值,如果没有,则返回undefined。

使用1:使用 call 方法来实现继承

function Product(name,price){	console.info(this);	this.name = name;	this.price = price;}function Car(name,price){	Product.call(this,name,price);	this.category = 'car';}	$(function(){	new Product();	var car = new Car('奔驰',100);	console.info(car);});

测试结果:

使用2:使用 call 调用匿名函数,方法为for循环传入不同的对象

$(function(){	var people = [		{name:'aaa',age:10},		{name:'bbb',age:20},	];	for(var i = 0;i

测试结果如下:

如果代码修改为:

$(function(){	var people = [		{name:'aaa',age:10},		{name:'bbb',age:20},	];	for(var i = 0;i

测试结果如下:

使用3:指定上下文 this

function greet(name,price){	var reply = [this.person,'aaa',this.role].join('|');	console.info(reply);}var i = {	person:'bbb',role:'ccc'}$(function(){	greet.call(i);});

测试结果如下:

示例:

function add(a,b){   alert(a+b);}function sub(a,b){   alert(a-b);}add.call(sub,3,1);//弹出4,实际调用的是add()方法,只是add()方法中的this指向的是sub函数...

三、apply

语法:fun.apply(thisArg [, argsArray])

thisArg:可选,在非严格模式下,如果 this 值设置为 null/undefined,则 this 指向去全局对象(浏览器中就是 window 对象),同时为原始值(数字,字符串,布尔值)的 this 会指向该原始的包装对象。

argsArray:可选。数组或者类数组对象(从ES5开始可以使用类数组对象)。

返回值:调用有指定this值和参数的函数的结果。

使用:其使用跟 call() 非常相似,只是提供参数的方式不同。

 

 

转载于:https://my.oschina.net/u/2331760/blog/2878666

你可能感兴趣的文章
Java程序员看C++代码
查看>>
python处理Excel - xlrd xlwr openpyxl
查看>>
JS实现的购物车
查看>>
bzoj 3998 [TJOI2015]弦论——后缀自动机
查看>>
STL 的 vector 根据元素的值来删除元素的方法
查看>>
NOI2002银河英雄传说——带权并查集
查看>>
复合数据类型,英文词频统计
查看>>
“main cannot be resolved or is not a field”解决方案
查看>>
oc中使用switch实现图片浏览功能,补充其它的实现方式
查看>>
6、DRN-----深度强化学习在新闻推荐上的应用
查看>>
用父类指针指向子类对象
查看>>
Flexigrid默认是可以选择多行
查看>>
PHP导入导出Excel方法小结
查看>>
ZOJ 3870 Team Formation 位运算 位异或用与运算做的
查看>>
清除浮动float的方法
查看>>
java学习第十二天
查看>>
1 Kubernetes管理之master和Node
查看>>
M端计算rem方法
查看>>
as3 用StyleSheet css 设置文本样式
查看>>
hdu4612(双连通缩点+树的直径)
查看>>