今天看到有些同学对this指向有疑问,总结了下。 首先,在普通函数中,this是指向调用此函数的对象。下面我们来看几个例子。 button按钮1/buttonbutton按钮2/buttonscript let btns = document.getE
今天看到有些同学对this指向有疑问,总结了下。
首先,在普通函数中,this是指向调用此函数的对象。下面我们来看几个例子。
<button>按钮1</button>
<button>按钮2</button>
<script>
let btns = document.getElementsByTagName('button')
btns[0].onclick = function() {
console.log(this === btns[0])
}
btns[1].addEventListener('click', function() {
console.log(this === btns[1])
})
</script>
//以下为控制台打印内容
true
true
可以看到,当我们点击这两个按钮时,返回的都是 true,这个相信大家都应该知道。那么我们看接下来的一个例子
<button onclick="pr()">按钮1</button>
<script>
function pr() {
console.log(this)
}
</script>
//以下为控制台打印内容
Window {window: Window, self: Window, document: document, name: '', location: Location, …}
当我们点击的时候,打印出来的是 Window 对象,这个pr函数通过上面的button点击调用,打印出来的不应该是button按钮吗?
其实这段代码我们可以这么理解
<button>按钮1</button>
<script>
function pr() {
console.log(this)
}
document.querySelector('button').onclick = function() {
pr()
}
这样子写的话,对打印出来的this是Window对象是不是就理解了呢?
看完了事件里面的this,我们再看一下另外的情况
<script>
let obj = {
age: 18,
say: function() {
console.log(this.name)
}
}
obj.say()
</script>
//以下为控制台打印内容
18
可以看到,打印出来的是 18 。这个相信大家没什么疑虑。
那我们给它变一变
<script>
let obj = {
age: 18,
say: function() {
console.log(this.age)
}
}
let fn = obj.say
fn()
</script>
//以下为控制台打印内容
undefined
这个就成了undefined,为什么呢?因为fn这个函数,也就是say这个函数,是window调用的。而window上时没有age这个属性的。
那我们再看一下箭头函数,箭头函数中的this是和调用者无关,指向的是定义箭头函数所在位置作用域的this
<button>按钮1</button>
<script>
document.querySelector('button').onclick = () => {
let obj = {
age: 18,
say: () => {
console.log(this)
}
}
obj.say()
}
</script>
//以下为控制台打印内容
Window {window: Window, self: Window, document: document, name: '', location: Location, …}
可以看到,打印出来的是Window对象。因为这两个都是箭头函数,所以this指向Window,没有问题。那我们修改下代码。
<button>按钮1</button>
<script>
document.querySelector('button').onclick = function() {
let obj = {
age: 18,
say: () => {
console.log(this)
}
}
obj.say()
}
</script>
//以下为控制台打印内容
<button>按钮1</button>
可以看到,我们把上层的函数改为普通函数,this就指向调用对象了。
是不是很简单呢?
