Typescript 调用array.map时如何设置“this”?

Typescript 调用array.map时如何设置“this”?,typescript,this,Typescript,This,我试图弄清楚,当将函数传递给数组的map方法时,“this”是如何绑定的 我有以下代码,您可以: 因此,在除直接引用函数成员外的所有情况下,调用方法时都会将此绑定到Foo对象 我无法将此与MDN上的array.prototype.map的值进行比较,该值表示: 如果为映射提供了thisArg参数,则它将用作回调函数的this值。否则,未定义的值将用作其此值 在上述所有情况下,我都没有显式地提供thisArg参数,那么为什么这4种方法中有3种可以工作呢 附加问题:为什么,如果我注释掉第一行导入“/

我试图弄清楚,当将函数传递给数组的map方法时,“this”是如何绑定的

我有以下代码,您可以:

因此,在除直接引用函数成员外的所有情况下,调用方法时都会将此绑定到Foo对象

我无法将此与MDN上的array.prototype.map的值进行比较,该值表示:

如果为映射提供了thisArg参数,则它将用作回调函数的this值。否则,未定义的值将用作其此值

在上述所有情况下,我都没有显式地提供thisArg参数,那么为什么这4种方法中有3种可以工作呢

附加问题:为什么,如果我注释掉第一行导入“/style.css”,这会使方法3突然也起作用吗

在上述所有情况下,我都没有显式地提供thisArg参数,那么为什么这4种方法中有3种可以工作呢

您没有为映射回调提供thisArg参数,但是您没有在映射回调中测试它,而是在一个Foo.method中测试它,这三个方法中都称为

foo.method()
这保证了在一个方法中,这将是foo,它与map无关,这就是调用方法的方式。操作员的行为一般

附加问题:为什么,如果我注释掉第一行导入“/style.css”,这会使方法3突然也起作用吗

这不是我看到的。这是我删除导入语句时打印的内容:

"this" is a Window

这与一致,其中,如果函数未接收到该对象,则将其设置为全局对象

当我说删除import语句有效时,我的意思是它不再是未定义的。我只测试了未定义与否,并在最后一分钟添加了类型名称的输出,但没有注意到它与其他类型名称不同。很抱歉我仍然不明白为什么添加/删除导入会打开或关闭严格模式!这可能是在StackBlitz上编译代码时如何设置构建/运行工具的人工制品。加载了type=module属性的脚本的浏览器。StackBlitz环境可能正在将此属性添加到包含导入或导出语句的javascript文件中,或者它可以将其作为普通脚本(不是模块)加载,而是添加使用严格;模拟模块的浏览器行为。我有一种感觉,这将是环境的,这是不幸的,因为我使用StackBlitz将所有内容剥离到最低限度,以删除任何特定于我真实代码的内容。我没有想到会发生这样的事情,这让我对使用StackBlitz来处理这类事情感到紧张。好吧,如果你的代码是TypeScript,那么你就不能真正运行你的代码,你必须编译它,如果你想在所有浏览器中运行模块化代码,除了编译器之外,还可能使用模块绑定器/加载器;这使得每件事都与环境有关。例如,请参阅编译器选项,它可能也会影响此选项。要通过引用MDN来解释您的答案,请参阅:当函数作为对象的方法调用时[例如foo.method],它的this设置为调用该方法的对象。但是在方法3中,foo.method被引用,而没有以那种方式被调用,因此它没有被设置或设置为globalThis对象。我想我明白了-谢谢。
foo.method()
"this" is a Window