闭包中的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指向父一级对象,如果没有了在继续向上查找吗?

闭包内存消耗可以这样理解吗???

每一次你去调用,需要把上一级的节点引入,对于内存中栈操作,就是放入一个内存中,并不会自动清除,这样的话,这条引用就一直存在内存中,所以就会一直延伸下去,就会造成内存的消耗

this this的用法 JavaScript

K.626 8 years, 8 months ago

在 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 8 years, 8 months ago

this 没有向上查找这一说。 this 是执行上下文环境的一个属性,是从执行上下文里面获得其值,而不是通过作用域链去查找。所以 this 和作用域链没有半毛钱关系。

不过题主对闭包的理解是OK的。因为如果保存了闭包中的变量,意味着有可能再次使用该变量,从而也就必须记录其作用域链,系统也就无法对闭包的变量和变量所依赖的作用域进行回收。完了就消耗了呗。所以如果要防止内存泄漏,切断对闭包中变量的引用就好。

xulvwen answered 8 years, 8 months ago

Your Answer