下面是这个现代 JavaScript 教程的代码片段:
let group = {
title: "Our Group",
students: ["John", "Pete", "Alice"],
showList() {
this.students.forEach(
student => alert(this.title + ': ' + student)
);
}
};
group.showList();
Run Code Online (Sandbox Code Playgroud)
本教程尝试this
用箭头函数进行解释,它说:
这里的forEach中,使用了箭头函数,因此
this.title
与外部方法showList中的完全相同。即:group.title。
我们知道this
箭头函数是按词法确定的。所以作用域链应该是:
global--> showList-->forEach-->arrow function
Run Code Online (Sandbox Code Playgroud)
在这种情况下,箭头函数的外部作用域应该forEach
代替showList
。因此this
in 箭头函数与 in 完全相同forEach
,这应该是undefined
因为没有thisArg
传递 to forEach
。但事实上,this
是group
,这意味着它与 中完全相同showList
。那么,在这种情况下似乎forEach
没有范围?我很困惑。
\n\n\n所以作用域链应该是:
\n\nRun Code Online (Sandbox Code Playgroud)\nglobal--> showList-->forEach-->arrow function\n
我认为您对“范围”的含义感到困惑。它是一个变量范围,在代码中通常用大括号分隔{\xe2\x80\xa6}
,在该区域中任何标识符始终引用同一变量。
没有“forEach
范围”。这只是一个函数调用。就像调用的参数列表没有范围一样alert(\xe2\x80\xa6)
。您的示例中只有三个范围:
global --> showList --> anonymous arrow function\n
Run Code Online (Sandbox Code Playgroud)\n\n还有调用堆栈,概述了哪些函数调用导致了当前代码的执行。这确实包含forEach
,它正在调用箭头函数,而箭头函数又将调用该alert
函数。但这与 JavaScript 中的作用域不对应(在学习闭包时您会看到更多示例),这就是为什么 JavaScript 被称为具有词法作用域而不是动态作用域(其中标识符根据函数所在的位置动态解析)称为)。