JavaScript-函数是否可以分别视为执行上下文?

Does a JavaScript-function can be seen as an execution context respectively as this?

在下面的示例中,为什么函数 outer 作为方法分配给具有标识符 meth 的对象-属性 没有执行上下文inner 函数中的 this?

由于分配给 meth 的函数 outer 似乎自动将 this-关键字设置为周围对象作为执行上下文,您可以假设函数 inner 以相同的方式处理,或者是因为周围的函数不能被视为执行上下文,因此 JavaScript 不知道函数 inner 它在哪个执行上下文中,所以它采用默认值,即 window?

var foo = {
    meth: function outer() {
        console.log(this);
        // let that = this;
        function inner() {
            console.log(this);
        }
        inner();
    }
};
//Output
{meth: ƒ}
Window {parent: Window, opener: null, top: Window, length: 0, frames: Window, …}

提前感谢您的揭秘

当您看到这段代码时:

function inner() {
    console.log(this);
}
inner();

该代码是否出现在另一个函数体中,或者该函数体是否属于某个对象的方法等,这些都无关紧要。这是无关紧要的。

相关的是你如何调用 inner。你称它不是 someobject.inner(),也不是显式绑定,比如 inner.call(this),...所以没有 this 的绑定,因此你得到默认绑定,即 window object when 运行 in sloppy mode, or undefined in strict mode.

The function outer assigned to meth seems to automatically get the this-keyword set to the surrounding object as execution context

这个不放心。如果你这样做:

let outer = meth.outer;
outer();

...然后您会注意到 this 也获得了默认绑定。同样,这取决于您如何调用 函数。

如果你用点符号调用它,那么你就隐式地将它与对象绑定:

meth.outer();

所以现在 thisouter 的执行上下文中将是 meth