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?
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?
第一个,o
是一个函数,在函数里给 this.a 赋值为 12, 函数没有被调用,即使调用了,原函数为什么要有o.a
呢?你觉得下面的 f 为什么没有属性a
呢?
第二个: new f()
的时候,会创建一个以f
为原型的对象,赋值给 this
然后执行这个函数。
也就是说这个新对象就会有属性a
。 然后由于 f 的返回不是对象,所以 new 的返回值是这个this
,因此, o2 就是这个新创建的对象,具有属性a
。
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关键词新建了一个对象,并为对象分配了内存空间,因此可以访问对象的属性。
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
楼上那篇文章蛮好的,我收藏了;我自己也记了一篇笔记关于this的
https://segmentfault.com/n/13...
用的语句更通俗,欢迎指教。