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:这里起作用的是什么?很好的解释