请解释给定代码的输出

时间:2017-07-08 03:06:50

标签: javascript

代码如下:

  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"?。程序以非严格模式运行。

3 个答案:

答案 0 :(得分:2)

如果makeWorker在没有a()的情况下被调用,那么

this有点多余,所以让我们用它的作用替换对makeWorker的调用:

function a() {
    this.ename = "Pete";
    var work = function() {
        console.log(this);
        console.log(this.ename);
    };
    work();
}

var ename = "John";
a();

并将对work的调用替换为它的作用:

function a() {
    this.ename = "Pete";
    console.log(this);
    console.log(this.ename);
}

var ename = "John";
a();

并将对a的调用替换为它的作用,再次假设this是全局对象:

var ename = "John";
this.ename = "Pete";
console.log(this);
console.log(this.ename);

因此,您将全局ename设置为"John",然后将其设置为"Pete",然后将其打印出来,结果为"Pete"。没什么奇怪的。当原始代码中的每个赋值发生时,它可能会帮助您记录某些内容:

function a() {
    function makeWorker() {
        console.log("Setting ename to Pete");
        this.ename = "Pete";
        return function() {
            console.log(this.ename);
        };
    }

    var work = makeWorker();
    work();
}

console.log("Setting ename to John");
var ename = "John";
a();

答案 1 :(得分:-1)

看起来您正在执行makeWorker,并且简单地覆盖变量ename,并且您想要访问全局变量。

查看这篇文章。 How to access global variable in function hook in javascript?

答案 2 :(得分:-2)

JavaScript中有几个不同的范围。变量ename是在函数范围内创建的。要访问全局范围变量,您必须以不同的方式调用它们。

https://www.w3schools.com/js/js_scope.asp