范围问题Javascript(self,this)

时间:2017-02-17 13:06:28

标签: 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("a -> " + a);    //Output: a -> 5
}
myFunc();

//代码结束

有人可以解释上面的console.log语句的输出。谢谢。

3 个答案:

答案 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,这很好。