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?
阅读 4.6k
9 个回答

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

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

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

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进行的一些操作,也就变成了构造函数初始化实例的一系列操作,达到了“构造”的目的。

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

<script>
var o = function () {
        this.a = 12;
    };
o();
console.log(window.a);
</script>
  • 无new,非严格模式,this为 window

  • 需要o.a = 12
    你可以这样

var o = function() {...}
o.a = 12;
> o
{ [Function] a: 12 }

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

我们都知道,this指向一个对象。

如下打印出的代码是function

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

这是因为o是一个函数,它只是声明有一个函数存在,但是并没有分配内存空间,所以就打印不出任何东西。

如下,打印的是object 12

function f() {
    this.a = 12;
}
var o2 = new f();
console.log(typeof o2);
console.log(o2.a);

这是因为使用new关键词新建了一个对象,并为对象分配了内存空间,因此可以访问对象的属性。

推荐问题
宣传栏