//代码启动
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语句的输出。谢谢。
答案 0 :(得分:2)
console.log("this.a -> " + this.a); //Output: this.a -> 4
this关键字指的是函数所属的对象,如果函数属于no object则指向window对象。那就是说你在顶部创建了一个变量a
并在函数内部更新了它。因此4
console.log("self.a -> " + self.a); //Output: self.a -> undefined
没有。自我引用窗口和窗口有变量a
。它应该打印4. Check again.
console.log("a -> " + a); //Output: a -> 5
a= 5
将全局变量视为声明的外部函数。您访问了更具体的变量。局部变量更具体。
答案 1 :(得分:1)
在Javascript中,每个范围级别都有this
。将this
保存在任何函数(顶级)之外的var self
中时,它会获取window
对象。因此,第一个this
(存储在self
中)与函数中的不同。在顶层没有定义属性“a”,因此self.a
未定义。
现在变量(var)和propery(obj.prop)之间存在差异。第一个将从作用域中解析(如果a未在当前作用域中定义,它将搜索它是否在更高的作用域中定义,直到找到“global vars”所在的窗口,并且如果仍未找到则未定义)。第二个将通过原型链搜索属性。
答案 2 :(得分:0)
我尝试了代码,self.a也是4,这很好。