全局范围和对象范围中的上下文和词汇环境



我是javascript的新手,对上下文和词法环境感到困惑。

情况1:

我在全球范围内:

function fun() {
console.log("It works!");
}
fun(); //prints It works!
this.fun(); //also prints It works!

当我写fun((时,我是否正确地假设this上下文是隐含的;没有this关键字?基本上,这里这个===全局/窗口。我的问题是,当我键入fun((时,this是否像我键入this.fun(;一样隐含;?或者,当我键入fun((;如果没有this关键字,JavaScript将在全局范围级别查看词法环境,即查看是否有一个有趣的函数在其当前范围中声明为全局?

情况2:

let cat = {
purr: function() {
console.log("meow");
},
purrMore: function() {
for (let i = 0; i < 10; i++) {
purr();
}
}
};
cat.purr();
cat.purrMore();

为什么当我在没有this的情况下调用purrMore中的purr时。,我有参考错误吗?如果案例1中的fun函数在没有this.的情况下工作。,并没有这个就不应该在这里工作吗。?

我的困惑如下:如果在案例1中,有趣的函数调用没有this。关键字之所以有效,是因为this。是隐含的,则purr函数调用不带this。也应该起作用。但是如果有趣的函数调用没有this。关键字使用了词法环境,那个么情况2不起作用就更有意义了。但是,为什么这个代码有效:

function purr() {
console.log("MEOW")
}
let cat = {
purr: function() {
console.log("meow");
},
purrMore: function() {
for (let i = 0; i < 10; i++) {
purr();
}
}
};
cat.purr();
cat.purrMore(); //prints MEOW ten times

为什么cat对象内部的purr函数不存在于purrMore的词汇环境中?

最后,我应该参考哪些主题或资源,以便消除我知识中的这些空白?

我对上下文和词汇环境感到困惑。

请记住,它们是完全独立的实体:

  • 默认情况下,this上下文是undefined,它只在a(方法调用b(草率模式中假设一个值
  • 词法环境不是javascript对象,它只存储声明的变量。它不受this值的影响
"use strict";
const fun = function() {
console.log(this);
}
fun(); // prints `undefined`
window.fun(); // throws exception

当我在不使用this关键字的情况下编写fun();时,我是否正确地假设this上下文是隐含的?

否。fun是在词汇范围内查找的,没有其他地方。

或者,当我键入不带this关键字的fun();时,JavaScript会在全局作用域级别查看词法环境,即查看是否有一个有趣的函数在其当前作用域中声明为全局函数?

是。在您的第一个示例中,没有本地作用域,因此它正在查找fun全局作用域,在那里它可以找到声明的函数。在您的purr()示例中,它首先在循环的块范围内查找,然后在函数的范围内,然后在全局范围内查找function purr

全局作用域是一个例外,因为与其他作用域不同,它(的一部分(由作为存储的对象(全局对象(支持。不过,你通常从不使用它。

在第二种情况下,使用方法purr定义对象cat,但在调用purr()时不引用该对象。Javascript正在全局范围中查找函数purr(),但没有找到它,并抛出引用错误。

工作示例:

let cat = { 
purr: function() { //<-- defined a
console.log("meow");
},
purrMore: function() {
for (let i = 0; i < 10; i++) {
this.purr(); // <-- "this" is the `cat object`
}
}
};
cat.purr();
cat.purrMore(); 

在第二个例子中,在第二种情况下,您在全局范围内定义purr((。。。

function purr() {
console.log("MEOW")
}

使引用有效。

我发现的理解javascript对象和作用域的最佳资源是:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

还有一个进一步的例子;词法范围;手段就在这里。

最新更新