js中关键字this的理解

本博客参考

  1. JS 方法名.call()方法
  2. 改变this指向,call,apply,bind的不同

js中函数的调用方法

  1. 简单调用
function say(){
	console.log(this)
}
//简单调用
say()
  1. 对象调用
    将要定义的函数放到一个对象里面定义,此时是的函数是一种对象方法
var obj={
	say:function(){
		console.log(this)
	}
}
//对象调用
obj.say()
  1. 构造函数调用
var obj = new say();
  1. 内置方法调用
    通过call()方法或apply()方法调用
say.call()

关于this

总结:指向一个对象,该对象被称为函数执行时的上下文对象

一种理解方法

下面我们要做的事情如下

  1. 先定义一个公共函数,用于输出该函数上文对象的名称属性
  2. 再定义两个对象,在这两个对象的内部调用上面的公共函数(对象方法),输出这两个对象的名称属性
  3. 依次调用公共函数和两个对象的对象方法,查看输出结果
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是一个html5 demo</title>

</head>
<body>
	<script>
		//定义一个全局变量
		var name="张三"
		//定义一个函数
		function saymyname(){
			console.log(this.name)
		}
		//定义对象1
		var obj1={
			name:"李四",
			say:saymyname
		}
		//定义对象2
		var obj2={
			name:"王五",
			say:saymyname
		}
		//函数的简单调用方法:此时saymyname()函数中的this指向window对象
		//相当于window.saymyname()
		saymyname()
		//以对象方法形式调用函数:此时saymyname()函数中的this指向obj1对象
		obj1.say()
		//以对象方法形式调用函数:此时saymyname()函数中的this指向obj2对象
		obj2.say()
	</script>
</body>
</html>  

Chrome浏览器运行结果

在这里插入图片描述

this关键字的另外一种理解

在面向对象的概念中,this相当于一个“指针”

  1. 在函数中,this会指向当前调用函数的元素
  2. 如果没有元素调用函数,this会指向window

在上面的例子中,我们根据这种理解方法进行分析

//没有元素调用函数,this指向window(实际上是window对象调用了saymyname()函数,所以this指向window),this.name相当于window.name
saymyname()
//obj1调用saymyname()函数,此时this指向obj1对象,this.name相当于obj1.name
obj1.say()
//obj2调用saymyname()函数,此时this指向obj2对象,this.name相当于obj2.name
obj2.say()

我们稍微修改一下上面的例子来验证我们的理解(重写saymyname()函数,使其输出this关键字的指向)

function saymyname(){
	console.log(this)
}

Chrome浏览器的运行结果
在这里插入图片描述

改变指向的方法

call()方法

实际上,call()方法是js中的一种调用函数的内置方法,可用于this的指向,使用格式

函数1.call(新指向,参数1,参数2,...)

示例

var m=2,n=3
function foo(n1,n2){
	console.log(this)
	console.log(n1+n2)
}
//第一次调用函数
foo(m,n)
//第二次调用函数
foo.call(document,m,n)

Chrome浏览器运行结果
在这里插入图片描述

apply()方法

apply()和call()的作用类似,只不过apply()的第二个参数必须是一个数组,而call 第二个参数可以是任意类型。

函数2.apply(新指向,[参数])

我们将上面的例子稍加修改

var m=2,n=3
function foo(n1,n2){
	console.log(this)
	console.log(n1+n2)
}
foo(m,n)
foo.apply(document,[m,n])

Chrome浏览器运行结果
在这里插入图片描述

bind()方法

该方法使用后会返回一个新函数(相当于原函数的拷贝,this指向改变,但是原函数不变),使用格式

函数.bind(新指向)(参数1,参数2,...)
//相当于
var 新函数=函数.bind(新指向)
新函数(参数1,参数2,..)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夺笋123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值