范围问题Javascript(self,this)

范围问题Javascript(self,this),javascript,Javascript,//代码开始 var self = this; var a=10; function myFunc(){ this.a = 4; var a = 5; console.log("this.a -> " + this.a); //Output: this.a -> 4 console.log("self.a -> " + self.a); //Output: self.a -> undefined console.log("

//代码开始

var self = this;
var a=10;

function myFunc(){
    this.a = 4;
    var a = 5;
    console.log("this.a -> " + this.a);   //Output: this.a -> 4
    console.log("self.a -> " + self.a);   //Output: self.a -> undefined
    console.log("a -> " + a);    //Output: a -> 5
}
myFunc();
//代码结束

有人能解释一下上面console.log语句的输出吗。多谢各位

    console.log("this.a -> " + this.a);   //Output: this.a -> 4
this关键字指函数所属的对象,如果函数不属于任何对象,则指窗口对象。也就是说,您在顶部创建了一个varaible
a
,并在函数内部对其进行了更新。因此
4

    console.log("self.a -> " + self.a);   //Output: self.a -> undefined
否。自引用窗口和窗口具有变量
a
。它应该打印4


a=5
将全局变量隐藏在声明的外部函数中。您访问了更具体的变量。局部变量具有更具体的属性。

我尝试了代码self。a也是4,这很好。

在Javascript中,每个作用域级别都有一个
这个
。当您在任何函数(顶层)之外的var
self
中保存
this
时,它将获得
窗口
对象。因此第一个
this
(存储在
self
中)与函数中的不同。顶层未定义属性“a”,因此未定义
self.a


现在变量(var)和属性(obj.prop)之间存在差异。第一个将从作用域中解析(如果在当前作用域中未定义,它将搜索是否在更高的作用域中定义,直到它找到“全局变量”所在的窗口,如果仍然未找到,则未定义)。第二个将通过原型链搜索财产。

这一点。a
a
是不同的目标,我没有足够的声誉来评论,这就是为什么我将self的输出设为4。aI在两个不同的位置获得两个不同的输出:jsfiddle output:self.a->4并使用nodejs outputs:self.a->undefinedanways运行。我的疑问是:全局范围中的“this”与函数中使用的“this”是否不同。我明白你的意思。我仍然面临的问题是,正如你所说的,由于“无属性”a“是在顶层定义的,因此self.a是未定义的。”。如果我创建了一个属性a=10作为上述代码的第一行,那么即使这样,我也会得到self.a的结果作为未定义。理想情况下,在全局范围内编写的所有3个ie.[window.a]、[this.a]和[a]不是都应该是相同的吗?只有当我在全局范围内使用“this.a=10”时,我才能得到self.a的答案。是的,因为“self.a”中的“a”是一个属性,而不是一个变量。如果您尝试“window.a”、“window['a'](任意位置)或“this.a”(顶层),您的self.a将在函数中定义。全局范围内的“var a”和“a”相同吗?是的(如果在严格模式下,所有变量都必须用“var”声明,否则会引发错误)。原因是,如果您分配的var没有“var”关键字,则它将被视为全局变量,在分配它的任何位置(这不是一个好的做法)
    console.log("a -> " + a);    //Output: a -> 5