有时候我们会搞不明白在javascript中this到底指向谁,下面我们就整理一下怎么判断this指向
this
的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定 this
到底指向谁,实际上 this
的最终指向的是那个调用它的对象。当函数被调用的时候,有一个最简单的判断 this
指向的方法:看前面时候有 .
, .
前面是谁, this
就指向谁。
var name = 'James';
function fn(){
var name = 'Curry';
console.log(this.name); //"James"
console.log(this); //"Window"
}
fn();
定义的 name
属性为全局属性,函数 fn()
是一个全局函数,全局属性和全局函数都是对象 Window
的方法。当函数 fn()
被调用的时候就是就相当于被 Window
对象调用,即 Window.fn()
,只不过 Window
对象不需要显示,所以函数 fn()
被调用时,this
指向 Window
。
var obj = {
name: 'James',
fn: function (){
console.log(this.name); //"James"
console.log(this); //{name: "James", fn: ƒ}
}
};
obj.fn()
这里的 this
指向的是对象 obj
,因为你调用这个 fn()
是通过 obj.fn()
执行的,那自然指向对象 obj
。
为dom元素添加事件,当这个事件被触发的时候,会执行一个函数,函数中的 this
指向当前这个元素
<style>
#btn{
width: 200px;
height: 50px;
background: rgba(24, 195, 225, 0.84);
}
</style>
<div id="btn"></div>
<script>
var oBtn = document.getElementById('btn')
oBtn.onclick = function (){
console.log(this); //<div id="btn"></div>
}
</script>
立即执行函数的 this
,永远都是指向 window
var obj = {
num: 999,
number: 3,
fn: (function () {
console.log(this); //"Window"
//console.log(num); //报错:num is not defined
console.log(this.num); //undefined
})() //立即执行函数
}
立即执行函数是指声明完之后便直接执行的函数,不管实例对象 obj
中的 fn()
函数有没有调用,所以立即执行函数中的 this
指向 Window
。而在全局作用域中由于并不存在变量 num
,所以 this.num
(即 window.age
)便不存在,就返回了 undefined
。
回调函数的 this
,一般都是指向 window
var obj = {
age: 18,
say: function (){
function callback(){
return this.age;
}
fn(callback)
}
}
function fn(callback){
var name = 'James';
console.log(name + ' is ' + callback() + ' years old')
}
obj.say(); //"James is undefined years old"
fn()
中执行的回调函数 callback()
返回的结果是 undefined
而不是 12
,函数内部的 this
指向于此函数的调用者(拥有者)。在上面这个例子中,虽然 callback
函数定义于对象 obj
的 say()
方法中,但实际上由于 callback
是在fn
函数中进行的普通调用,那么 fn
中的 callback
的调用者我们便可以理解为是 window
对象,因此, callback
中的 this
便指向了 window
,而在全局作用域中由于并不存在变量 age
,所以 this.age
(即 window.age
)便不存在,就返回了 undefined
。
那么我们怎么得到我们需要的值呢,可以使用 call/apply/bind
改变this指向来得到我们需要的值
将 fn
中对 callback()
的调用方式换成
callback.call(obj)
或
callback.apply(obj)
或者
callback.bind(obj)
通过使用方法 call/apply/bind
将 callback
内部的 this
指向对象 obj
,这样可得到我们想要的结果
console.log(name + ' is ' + callback.call(obj) + ' years old'); //"James is 18 years old"
var age = 100;
var obj = {
age: 18,
say: function (callback){
this.fn = callback;
this.fn()
},
say2: function (callback){
callback()
}
}
function callback(){
console.log(this.age)
}
obj.say(callback); //"18"
obj.say2(callback); //"100"
obj.say(callback)
触发时,进入 say
函数的执行上下文,此时this
指向 say
函数的调用者 obj
obj.say2(callback)
触发时,进入 say
函数里的 callback
函数,也就是全局函数 callback
函数本身,此时的 this
指向全局作用域中 callback
的调用者 window
对象。
网友评论