问题描述
我以为我对“ this”关键字有了很好的了解,但是我在这里完全迷失了。
(*)我知道函数中的“ this”将引用浏览器中的全局对象窗口。因为非严格模式下的默认绑定,否则未定义。
我知道,“ this”如果在方法中调用,它将引用函数/方法的所有者,即持有该方法的对象。
我知道call()和apply()可以在提供的对象范围内放置一个带有“ this”的函数。
我对此一无所知:
示例A:
function defer(f,ms) {
return function(...args) {
let ctx = this;
setTimeout(function() {
return f.apply(ctx,args);
},ms);
};
}
function sayHi(who) {
alert('Hello,' + who);
}
let sayHiDeferred = defer(sayHi,2000);
sayHiDeferred("John"); // Hello,John after 2 seconds
-
为什么必须分配ctx = this?如果直接在apply中插入“ this”也可以。像示例B或更简化的示例C一样,不使用apply()也可以工作。 ctx = this服务
-
当回调函数传递给setTimeout,forEach之类的预定义函数时,它们在技术上都是对象方法...我怎么知道这些函数是否修改了“ this”的值,因为它们是由Object方法调用的
-
我知道f.apply(ctx,args)或f.apply(this,args)试图将function(.. args)转换为对象,这样可以避免在那里丢失参数。特别是当包装函数在不同的上下文/对象中传递时,它仍然可以找到那些参数。但是我不确定吗?
示例B:
function defer(f,ms) {
return function(...args) {
setTimeout(function() {
return f.apply(this,John after 2 seconds
- 当人们说时,箭头函数没有“ this”,因此它使用父函数的this值。这是否意味着setTimeout的“ this”将引用返回function(){...}?
示例C:
function defer(f,ms) {
return function(...args) {
setTimeout(function() {
return f(...args);
},John after 2 seconds
最后一个澄清:箭头函数既没有“ this”也没有args,因此这里“ this”引用父函数whjich是setTimeout的“ this”,导致this = function(){},我不知道它如何定义功能范围,除非将其视为对象。特别地,根据先前的知识(*)。任何函数中的“ this”将始终默认引用全局对象。我唯一的假设是,因为我们使用了apply(),基本上将函数转换为对象。函数?
示例D:
function defer(f,ms) {
return function() {
setTimeout(() => f.apply(this,arguments),ms)
};
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)