Javascript 理解“的价值”;这";在嵌套函数中,包装器函数

Javascript 理解“的价值”;这";在嵌套函数中,包装器函数,javascript,function,scope,this,wrapper,Javascript,Function,Scope,This,Wrapper,我原以为我对“this”关键字有很好的理解,但我在这里完全迷路了 (*)我知道函数中的“this”会引用浏览器中的全局对象窗口。因为默认绑定在非严格模式下,否则未定义 我知道,如果在方法中调用“this”,它将引用函数/方法的所有者,即持有该方法的对象 我知道call()和apply()可以将带有“this”的函数放在所提供对象的范围内 我有点不知所措: 示例A: 功能延迟(f,ms){ 返回函数(…args){ 设ctx=这个; setTimeout(函数(){ 返回f.apply(ctx,a

我原以为我对“this”关键字有很好的理解,但我在这里完全迷路了

(*)我知道函数中的“this”会引用浏览器中的全局对象窗口。因为默认绑定在非严格模式下,否则未定义

我知道,如果在方法中调用“this”,它将引用函数/方法的所有者,即持有该方法的对象

我知道call()和apply()可以将带有“this”的函数放在所提供对象的范围内

我有点不知所措:

示例A:

功能延迟(f,ms){
返回函数(…args){
设ctx=这个;
setTimeout(函数(){
返回f.apply(ctx,args);
},ms);
};
}
功能赛喜(世卫组织){
警惕(“你好,”+who);
}
让Sayideferred=延迟(sayHi,2000);
赛希德费尔德(“约翰”);//你好,约翰,2秒钟后
  • 为什么有必要指定ctx=这个?如果直接在apply中插入“this”,也可以。与示例B或更简化的示例C一样,不使用apply()也可以。什么服务于ctx=这个

  • 当回调函数传递到预定义函数(如setTimeout、forEach)中时,它们在技术上都是对象方法……我怎么知道这些函数是否修改了“this”的值,因为它们是由对象方法调用的

  • 我认为f.apply(ctx,args)或f.apply(this,args)试图将函数(…args)转换为对象,以避免丢失其中的参数。特别是当包装函数在不同的上下文/对象中传递时,它仍然可以找到这些参数。但我不确定

  • 例B:

    功能延迟(f,ms){
    返回函数(…args){
    setTimeout(函数(){
    返回f.apply(此参数为args);
    },ms);
    };
    }
    功能赛喜(世卫组织){
    警惕(“你好,”+who);
    }
    让Sayideferred=延迟(sayHi,2000);
    赛希德费尔德(“约翰”);//你好,约翰,2秒钟后
    
  • 当人们说,箭头函数没有“this”,所以它使用父函数的this值。这是否意味着setTimeout的“this”将引用返回函数(){…}
  • 例C:

    
    功能延迟(f,ms){
    返回函数(…args){
    setTimeout(函数(){
    返回f(…args);
    },ms);
    };
    }
    功能赛喜(世卫组织){
    警惕(“你好,”+who);
    }
    让Sayideferred=延迟(sayHi,2000);
    赛希德费尔德(“约翰”);//你好,约翰,2秒钟后
    
    最后澄清:arrow函数没有“this”或args,因此这里的“this”引用了父函数,而setTimeout是“this”,导致this=function(){},我不知道它如何定义函数作用域,除非它将其视为对象。特别是,根据先前的知识(*),任何函数中的“this”都默认为对全局对象的引用。我唯一的假设是因为我们使用apply(),基本上将该函数转换为object.function

    例D:

    功能延迟(f,ms){
    返回函数(){
    setTimeout(()=>f.apply(这个,参数),毫秒)
    };
    }
    

    来源于

    在上述所有情况下,A、B、C和D,
    从不使用此
    。因此,此的值是多少并不重要。您甚至可以用任何值替换
    这个
    返回f.apply(null,args)将非常好地工作。甚至
    返回f.apply(“,args)