javascript - 闭包中的this与构造函数中的this指向问题
ringa_lee
ringa_lee 2017-04-10 15:39:14
[JavaScript讨论组]
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指向父一级对象,如果没有了在继续向上查找吗?

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

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

ringa_lee
ringa_lee

ringa_lee

全部回复(2)
ringa_lee

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

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

高洛峰

在 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就指向了这个对象。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号