【问题标题】:Please explain the output of the given code请解释给定代码的输出
【发布时间】:2017-07-08 03:06:49
【问题描述】:

代码如下:

  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”呢?程序在非严格模式下运行。

【问题讨论】:

  • @MiHawk:提升在哪里发挥作用?

标签: javascript


【解决方案1】:

如果a() 在没有this 的情况下被调用,那么makeWorker 在这里有点多余,所以让我们用它的作用替换对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();

【讨论】:

  • 很好的解释
【解决方案2】:

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

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

【讨论】:

  • 如果您的答案中的所有相关详细信息都在另一个 SO 帖子的链接中提供,那么这个问题应该作为该帖子的副本关闭。你应该这样标记它。
【解决方案3】:

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

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

【讨论】:

  • 要在本地函数范围内创建变量时在全局范围内访问变量,您必须使用 window.{variableName} 调用它,在您的情况下为 window.ename
  • 您永远不必为了添加详细信息而对自己的答案发表评论。您始终(无论声誉如何)都可以编辑自己的问题或答案。请这样做。
  • 这个答案是错误的。这里的任何函数范围内都没有ename 变量。
猜你喜欢
  • 2015-07-13
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 2022-06-27
相关资源
最近更新 更多