代码如下:
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"?。程序以非严格模式运行。
答案 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是在函数范围内创建的。要访问全局范围变量,您必须以不同的方式调用它们。