首页 > javascript this问题

javascript this问题

var o = function () {
        this.a = 12;
    };

    console.log(o.a);//为什么是undefined?
 
function f() {
    this.a = 12;
}

var o2 = new f();
console.log(o2.a);//为什么是12?

<script>
var o = function () {
        this.a = 12;
    };
o();
console.log(window.a);
</script>
var o = function() {...}
o.a = 12;
> o
{ [Function] a: 12 }

具体你可以参考这个https://.com/n/13...


第一个,o 是一个函数,在函数里给 this.a 赋值为 12, 函数没有被调用,即使调用了,原函数为什么要有o.a呢?你觉得下面的 f 为什么没有属性a 呢?

第二个: new f() 的时候,会创建一个以f为原型的对象,赋值给 this 然后执行这个函数。
也就是说这个新对象就会有属性a。 然后由于 f 的返回不是对象,所以 new 的返回值是这个this,因此, o2 就是这个新创建的对象,具有属性a


楼上那篇文章蛮好的,我收藏了;我自己也记了一篇笔记关于this的
https://.com/n/13...
用的语句更通俗,欢迎指教。


this代表对象的引用
对于变量o,它指向函数的引用,o表示函数引用,o()表示函数调用,new o()表示创建对象。
在函数调用里,this表示window对象,所以你在调用o(),this.a表示全局变量a。
为什么o.a为undefined呢?如果你调用该函数的同时,给o.a赋值就懂了,a是该函数的属性。
第二个你new了,也就是创建了一个对象,此时的this就是该对象(也就是o的实例对象)


跟你这么说吧,function中的this,你可以理解为调用这个function的对象
function 大多被作为对象的方法来调用。此时this就指向这个对象。
就算作为普通函数直接调用,效果也等同于被作为全局对象 window 的方法来调用。

var o = function() { this.a = 12;}

这个时候你声明了一个对象。

如果你把它当做普通函数来调用,比如直接调用。

o();

这个时候看起来是没有对象调用它的,实际上在js环境下,此时这个方法被全局对象 window 调用。
这个时候 window 被这个 fn 操作了一下,于是 window 将会被绑定一个属性 a,值为12。

window.a;// 12

如果你想用别的对象调用它,也可以啊。用call,或者apply。

var obj = {}
o.call(obj);
obj.a;// 12

这个时候,新创建的 obj 被函数 o 操作,被赋予了一个值为12的属性 a。

在下面的时候你把它当做构造函数来调用。

当函数被调用的时候,前面加上了关键字 new,那么就会被认为,你要把这个函数当做构造函数来调用。
此时函数将返回一个新对象,也就是函数中出现的this。

此时你在函数中对this进行的一些操作,也就变成了构造函数初始化实例的一系列操作,达到了“构造”的目的。

区分一下两种调用方式,问题就解决了。


console.log(typeof o);
console.log(typeof new o());
这样看直观,这两个上边是方法,下面new 出来的对象


看看这篇博客,希望对你有帮助:https://.com/a/11...

【热门文章】
【热门文章】