javascript - 看代码,为什么不var base,this指向的是window?求指导
巴扎黑
巴扎黑 2017-04-11 11:25:11
[JavaScript讨论组]
function Base(){

    this.elements=[];
    
}
var base=new Base();
巴扎黑
巴扎黑

全部回复(4)
黄舟

对于直接定义的函数,this指向window。
对于对象的方法,this指向实例化对象

伊谢尔伦

不用 var 声明的变量一律被定义为全局变量,而全局变量的作用域恰恰是window,所以其this指向就是window

PHP中文网

题主本身的问题很没有意义,不过倒是可以借这个问题,来说一下我对构造函数的理解,顺便说一下有var和无var的情况原理。
构造函数其实和普通函数本质上并无区别,唯一的区别有两个:

  • 函数首字母大写,这个区别只是约定俗成的,便于区分。你实在要小写定义构造函数也完全没问题,所以这个区别可以忽略。

  • 构造函数的调用需要用new操作符,而普通函数的调用又分很多种,但是都不会用到new操作符。所以,构造函数和普通函数的区别就在这个new操作符里,现在让我们来好好研究一下这个new操作符。
    用new操作符创建对象时发生的事情:

  1. 创建一个Object对象实例。

  2. 将构造函数的执行对象赋给新生成的这个实例。
    注意:原本的构造函数是window对象的方法,如果不用new操作符而直接调用,那么构造函数的执行对象就 是window,即this指向了window。现在用new操作符后,this就指向了新生成的对象。理解这一步至关重要。

  3. 执行构造函数中的代码,看代码:


    function Person(){
            this.name = "Tiny Colder";
            var age = 22;
            window.age = 22;
        }
        var p = new Person();
        alert(p.name)//Tiny Colder;
        alert(p.age)//undefined;
        alert(window.age)//22;

当用new操作符创建对象时,先创建了一个对象实例,然后执行代码。所以还在纠结,什么时候构造函数定义的属性会继承给实例对象的,都可以这么来看:

   

     var p = new Object();
        p.name = "Tiny Colder";

这是普通的创建对象,然后给对象添加属性的方法。如果每创建一个对象,都需要这么几行代码,无疑是糟糕的。这个需求就正好跟这一点对应:new操作符,自动执行构造函数里的代码。如此我们便可以省掉添加属性时重复冗余的代码。那么这些属性时如何添加到新生成的对象里的呢?

第二个步骤里已经说了:将构造函数的执行对象赋给新生成的这个实例。再结合上一段里说的,自动执行构造函数里的this.name = "Tiny Colder";时,就相当于是执行p.name = "Tiny Colder";而构造函数里的

var age = 22;语句,会执行但是对新生成的对象并无影响。
window.age = 22;语句,会执行,且会给window对象添加一个属性。alert为证。

或许到这里,你已经理解了new操作符的前三步了,重要的三步。但是这个函数是如何返回对象的呢?我们并没有看到有任何跟return相关的语句。这就是new操作符的最后一步:返回新生成的对象。
如果被调用的函数没有显式的 return 表达式(仅限于返回对象),则隐式的会返回 this 对象 - 也就是新创建的对象。

现在来看一下这个代码:


    function Person(){
            this.name = "Tiny Colder";
            return {};
        }
        var p = new Person();
        alert(p.name)//undefined;

一个对象就这么被创建出来了。
实际上,

 

            var p = new Person();
            和
            var p = new Object();
            Person.apply(p);
            是一样的效果。
先说这些,以后再补充,个人见解,欢迎指正!
天蓬老师

JavaScript的函数内部如果调用了this,那么这个this到底会指向谁呢?

答案是,不确定!

如果以对象的方法形式调用,比如Airi.age(),该函数的this指向被调用的对象,也就是Airi

如果单独调用函数,比如getAge(),此时,该函数的this指向全局对象,也就是window

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

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