Javascript 理解“的价值”;这";在嵌套函数中,包装器函数
我原以为我对“this”关键字有很好的理解,但我在这里完全迷路了 (*)我知道函数中的“this”会引用浏览器中的全局对象窗口。因为默认绑定在非严格模式下,否则未定义 我知道,如果在方法中调用“this”,它将引用函数/方法的所有者,即持有该方法的对象 我知道call()和apply()可以将带有“this”的函数放在所提供对象的范围内 我有点不知所措: 示例A: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
功能延迟(f,ms){
返回函数(…args){
设ctx=这个;
setTimeout(函数(){
返回f.apply(ctx,args);
},ms);
};
}
功能赛喜(世卫组织){
警惕(“你好,”+who);
}
让Sayideferred=延迟(sayHi,2000);
赛希德费尔德(“约翰”);//你好,约翰,2秒钟后
功能延迟(f,ms){
返回函数(…args){
setTimeout(函数(){
返回f.apply(此参数为args);
},ms);
};
}
功能赛喜(世卫组织){
警惕(“你好,”+who);
}
让Sayideferred=延迟(sayHi,2000);
赛希德费尔德(“约翰”);//你好,约翰,2秒钟后
功能延迟(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)代码>