闭包中的this与构造函数中的this指向问题
function qq (argument) {
//输出的结果1
console.log(this);
t = this;
b = '123';
function aa()
{
var tt = this;
//输出的结果2
console.log(tt);
o = t;
//输出的结果3
console.log(o);
console.log('run');
}
return aa;
}
三个输出的结果一样,就是说this都指向了全局的window对象了?
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.out=function(){
var self=this;
//输出的结果4
console.log(self);
console.log(this.name+':'+this.age);
}
new Person('dd',90).out()
输出的结果4的,说明原型变量中,this指向父一级对象,如果没有了在继续向上查找吗?
闭包内存消耗可以这样理解吗???
每一次你去调用,需要把上一级的节点引入,对于内存中栈操作,就是放入一个内存中,并不会自动清除,这样的话,这条引用就一直存在内存中,所以就会一直延伸下去,就会造成内存的消耗
K.626
9 years, 3 months ago
Answers
在 ECMAScript 中,要掌握的最重要的概念之一是关键字 this 的用法,它用在对象的方法中。关键字 this 总是指向调用该方法的对象
http://www.w3school.com.cn/js/pro_js_object_scope.asp
个人理解:this用在对象方法中,如果不是对象的方法,是没有this变量的。
function foo(){ function bar(){ } bar(); } foo();
首先浏览器中的顶级域,其实就是window对象。
执行foo也好,bar也好,都不是通过对象调用的方法,所以foo,bar并没有this变量,foo,bar中的this其实是闭包中上层作用域的this变量。
所以题主第一段代码中的各种this,其实都是window(顶级域)对象自己。
那么第二段中的this,就很明显了,因为var p = new Person是一个实例(对象),所以new出的实例对象p,p.out()中的this,指向p。
而new方法的实际意义是:
比如 var p = new Person(); 等价于 var p = {}; p.__proto__ = Person.prototype; Person.call(p); //p调用Person,所以Person在构造的时候this是指向new生成的实例的。
通俗点说就是,谁调用这个函数(即xxx.fn()中的xxx),谁就是这个函数(fn)的this。
题外话:
var bar = {baz:"baz"}; function foo(){ console.log(this) } foo.call("bar); //输出Object {baz: "baz"}
call方法其实就是让一个对象调用一个函数,这个函数的this就指向了这个对象。
喵Meo.w
answered 9 years, 3 months ago