Javascript Arrow函数具有这种行为

Javascript Arrow函数具有这种行为,javascript,this,Javascript,This,请告诉我这两种情况下的行为。为什么一个显示“窗口”,另一个显示“对象”。尽管回调以相同的方式调用它们 案例:1 let army = { minAge: 18, maxAge: 27, canJoin(user) { console.log(this); } }; function karan(callback){ callback(); } karan(army.canJoin); 结果是窗口对象 案例:2 le

请告诉我这两种情况下的行为。为什么一个显示“窗口”,另一个显示“对象”。尽管回调以相同的方式调用它们

案例:1

let army = {
    minAge: 18,
    maxAge: 27,
    canJoin(user) {
        console.log(this);
    }
  };

function karan(callback){
    
    callback(); 
}  

karan(army.canJoin);
结果是窗口对象

案例:2

let army = {
    minAge: 18,
    maxAge: 27,
    canJoin(user) {
        console.log(this);
    }
  };


function karan(callback){
    
    callback(); 
}  


karan( () => army.canJoin());

结果:对象

在案例1中,您正在经历有时称为“上下文丢失”的情况。一旦函数
army.canJoin
被传递到
karan
,它将丢失
army
的“上下文”,因此
默认为
窗口
对象

在案例2中,如果执行
army.canJoin()
,则调用的是
canJoin
“作为army的一种方法”,而不是作为一个独立函数。这意味着
将是您用来通过点运算符访问
canJoin
的对象


有关详细信息:

是上下文对象,将在执行时传递给函数。指定上下文的方法之一是将其作为对象上的方法调用

案例:1

let army = {
    minAge: 18,
    maxAge: 27,
    canJoin(user) {
        console.log(this);
    }
  };

function karan(callback){
    
    callback(); 
}  

karan(army.canJoin);
您只将函数
army.canJoin
发送到
karan
作为
callback

karan(army.canJoin);
function karan(callback){
    callback(); // when the function is called here, there is no explicit context,
    // `this` will default to the window object in browser environment.
} 

此时,函数与原始上下文对象分离,然后在调用
callback()

案例:2

let army = {
    minAge: 18,
    maxAge: 27,
    canJoin(user) {
        console.log(this);
    }
  };


function karan(callback){
    
    callback(); 
}  


karan( () => army.canJoin());
当原始上下文附加到该函数时,将执行该函数

army.canJoin() // the context or `this` is still army object
请注意,对于此特定情况。它与箭头功能无关, 如果执行以下操作,您仍将获得
作为陆军对象

karan(function(){ army.canJoin() })

这回答了你的问题吗?