2017-07-08 92 views
0

的代码如下给出的给定的代码的输出:请解释

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输出到“皮特”。但我已经定义在全局scope.So另一个变量的ename为什么是“皮特“打印而不是”John“?程序运行在非严格模式下。

+0

@MiHawk:这里的升降机在哪里起作用? – Ryan

回答

-2

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

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

+0

要在全局作用域访问变量,在本地函数作用域创建变量时,必须使用窗口调用它{variableName},在您的案例中window.ename –

+0

您绝不应该向您自己发表评论回答以添加详细信息。你总是(无论名誉)有能力编辑自己的问题或答案。请这样做。 –

+0

这个答案只是错误的。这里没有任何函数范围的'ename'变量。 – melpomene

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(); 

and replac E中的呼叫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();

+0

很好的解释 –

-1

它看起来像您正在执行的makeWorker,这是简单的重写变量的ename,和你想要访问全局变量。

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

+0

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

+0

嘿肯,谢谢你的抬头! – TheRock