普通函数调用
console.log(this) //Window
var aa = {
name:"aa",
fun: function(){
console.log(this)//{name: "aa", fun: ƒ}
}
}
aa.fun()
第一个打印输出语句是由window对象直接调用,所以this指向window,第二个是由aa对象直接调用,所以this指向aa。
var aa = {
name:"aa",
fun: function(){
function f(){
console.log(this) //window
}
f()
}
}
aa.fun()
与上一个不同的是,在fun函数中嵌套了一个f()函数,当我同样使用aa.fun去调用时,this指向window.这是因为f函数是在fun函数中,是属于普通函数调用,并没用通过aa对象直接调用,而是自执行,这时候f就属于全局函数
var aa = {
name:"aa",
fun: function(){
return function (){
console.log(this) //window
}
}
}
aa.fun()()
在此情况下,aa.fun()是一个普通函数,而我们在调用时,是由window对象直接调用的,所以此时this指向window
var aa = {
name:"aa",
fun: function(){
// console.log(this)//{name: "aa", fun: ƒ}
function f(){
console.log(this)
}
f.bind(this)() //{name: "aa", fun: ƒ}
f.apply(this) //{name: "aa", fun: ƒ}
f.call(this) //{name: "aa", fun: ƒ}
}
}
aa.fun()
在函数调用时,可以使用bind/call/apply来改变this指向,其中bind返回一个函数,而call和aply是返回一个对象
回调函数
function cc(){
console.log(this) //window
}
var bb = {
name:"bb",
fun:function (callback){
console.log(this) //object {name:bb,fun:f}
callback()
}
}
bb.fun(cc)
这是一个回调函数,主函数为bb(),回调函数为cc(),当主函数执行完成后,执行回调函数,回调函数中,默认this指向window,因为本质上是在函数内callback,并不是由对象直接调用
箭头函数
var dd = {
name:"dd",
fun:function(){
console.log(this) //{name: "dd", fun: ƒ, ee: ƒ}
var f1= ()=>{
console.log(this) //{name: "dd", fun: ƒ, ee: ƒ}
}
f1()
},
ee:()=>{
console.log(this) //window
}
}
dd.ee()
dd.fun()
箭头函数中是没有this的,所以箭头函数中的this是继承上层作用域中的this
ee是一个函数,这个函数内部的this等同于上层作用域中this指向,而dd.ee()是由window对象直接调用的,所以这里的this指向window (官方解释:this指向定义时的this,而不是使用时的this)
f1是fun函数内的一个函数,当调用fun函数时,会调用f1函数,所以f1函数内this继承fun函数内this,也就指向了dd对象。利用这一点,以后可以用箭头函数来改变this指向。
构造函数
function gg(){
var name="gg"
this.fun=function(){
console.log(this) //gg {fun: ƒ}
}
console.log(this.name) //undefined
console.log(this) //gg {fun: ƒ}
}
var obj = new gg()
obj.fun()
首先构造函数创建一个新对象,然后将作用域赋给这个新对象,这时函数中this就指向了这个新对象,使用new创建的是一个空对象,然后使用this来初始化新创建的对象的属性,这也就是为什么this.name=undefined,因为他并没有被初始化,所以在调用fun方法时,this就指向这个对象。
setTimeOut和setInterval函数
setTimeout(()=>{
console.log(this) //window
},0)
setInterval(function (){
console.log(this) //window
},1000)
这两个函数都是window对象下的函数,是由window对象直接调用,所以他们内部的this一般直接指向window
就先到这里吧!以后有更多了解再更新。