Javascript 请解释给定代码的输出
代码如下:Javascript 请解释给定代码的输出,javascript,Javascript,代码如下: function a() { function makeWorker() { this.ename = "Pete"; return function() { console.log(this); console.log(this.ename); }; } var work = makeWorker(); work(); } var ename =
function a() {
function makeWorker() {
this.ename = "Pete";
return function() {
console.log(this);
console.log(this.ename);
};
}
var work = makeWorker();
work();
}
var ename = "John";
a();
this.name输出到Pete.但是我在全局范围中定义了另一个变量ename。那么为什么Pete打印而不是John?。程序在非严格模式下运行。在JavaScript中有几个不同的范围。变量ename是在函数范围内创建的。要访问全局作用域变量,必须以不同的方式调用它们 如果在没有this的情况下调用a,那么makeWorker在这里有点多余,所以让我们用它的功能替换对makeWorker的调用:
function a() {
this.ename = "Pete";
var work = function() {
console.log(this);
console.log(this.ename);
};
work();
}
var ename = "John";
a();
function a() {
this.ename = "Pete";
console.log(this);
console.log(this.ename);
}
var ename = "John";
a();
并用它所做的事情来代替对工作的要求:
function a() {
this.ename = "Pete";
var work = function() {
console.log(this);
console.log(this.ename);
};
work();
}
var ename = "John";
a();
function a() {
this.ename = "Pete";
console.log(this);
console.log(this.ename);
}
var ename = "John";
a();
并将对a的调用替换为它所做的,再次假设这是全局对象:
var ename = "John";
this.ename = "Pete";
console.log(this);
console.log(this.ename);
因此,您将全局ename设置为John,然后将其设置为Pete,然后打印它,结果是Pete。没什么奇怪的。在原始代码中每次分配时,它可能会帮助您记录一些内容:
功能a{
函数makeWorker{
console.log将ename设置为Pete;
this.ename=Pete;
返回函数{
console.logthis.ename;
};
}
var-work=makeWorker;
工作
}
console.log将ename设置为John;
var ename=约翰;
a 看起来您正在执行makeWorker,重写变量ename很简单,您希望访问一个全局变量 看看这篇文章。
在局部函数作用域创建变量时,要在全局作用域访问变量,必须使用窗口调用它。{variableName},在您的示例window.enamey中,您永远不必在自己的答案中添加注释以添加详细信息。无论声誉如何,您都可以编辑自己的问题或答案。请这样做。这个答案是错误的。此处的任何函数范围中都没有ename变量。如果您的答案中的所有相关详细信息都在指向其他SO帖子的链接中提供,则此问题应作为该帖子的副本关闭。你应该这样标记它。@MiHawk:这里起作用的是什么?很好的解释