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

JavaScript函数是否可以分别视为执行上下文?,javascript,function,this,executioncontext,Javascript,Function,This,Executioncontext,在下面的示例中,为什么作为方法分配给标识符为meth的对象属性的函数outer没有执行上下文,而该执行上下文将是inner函数中的this 由于分配给meth的函数outer似乎会自动将this-关键字设置为周围对象的执行上下文,因此您可以假设,函数inner的处理方式相同,或者是因为周围函数不能被视为执行上下文,因此,JavaScript不知道函数内部所处的执行上下文,因此它假定默认值为窗口 var foo = { meth: function outer() { co

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


由于分配给
meth
的函数
outer
似乎会自动将
this
-关键字设置为周围对象的执行上下文,因此您可以假设,函数
inner
的处理方式相同,或者是因为周围函数不能被视为执行上下文,因此,JavaScript不知道函数
内部
所处的执行上下文,因此它假定默认值为
窗口

var foo = {
    meth: function outer() {
        console.log(this);
        // let that = this;
        function inner() {
            console.log(this);
        }
        inner();
    }
};

当您看到以下代码时,请提前感谢您解开谜团:

function inner() {
    console.log(this);
}
inner();
代码是否出现在另一个函数体中,或者该函数体是否属于某个对象的方法,等等,都是无关紧要的。这无关紧要

相关的是如何调用
internal
。您不能将其称为
someobject.inner()
,也不能使用显式绑定,如
inner.call(this)
。。。因此,此没有绑定,因此您将获得默认绑定,即在草率模式下运行时的
窗口
对象,或在严格模式下运行时的
未定义

分配给
meth
的函数
outer
似乎会自动将
this
-关键字设置为周围对象的执行上下文

这是不确定的。如果您这样做:

let outer = meth.outer;
outer();
…然后您会注意到,
也将获得默认绑定。同样,这取决于调用函数的方式

如果使用点表示法调用它,则隐式地将其与对象绑定:

meth.outer();

所以现在
这个
将是
meth
外部
的执行上下文中

“您可以假设,内部函数的处理方式是相同的”-为什么您可以假设呢?这是一个不同的函数,调用方式也不同。“因为
outer
似乎会自动将this关键字设置为周围对象的执行上下文”-不,它不会自动获取该关键字。在代码中,您甚至没有显示如何调用它。
内部
函数不是从对象调用的
指调用函数的对象。e、 g.这个。该行为在和下的规范中定义(无论是否在严格的模式代码中发生)
meth.outer();