javascript - 这段代码的this指向的是谁?
PHPz
PHPz 2017-04-10 16:17:05
[JavaScript讨论组]

代码:

  function F(){
    function C(){
      console.log(this);
      return this;
    }
    return C();
  }
  var o = new F();

上面的this指向的是全局对象还是对象o?

怎么理解呢?

PHPz
PHPz

学习是最好的投资!

全部回复(8)
怪我咯
function F(){
   function C(){
      //console.log(this);
      return this;
   }
 return C();
}
var o = new F();

在函数对象F中定义了函数C
以函数的方式执行C,那么
console.log(this);this指向全局变量
函数C执行后返回了this,并且被F函数返回
var o=new F();new操作符执行后,o指向了函数对象F返回的,也就是全局变量
因为JS引擎有规则,
如果在一个函数作为构造器执行,也就是通过new执行时,没有使用return语句返回,那么new操作符就会返回这个构造函数的实例对象。
如果有使用return语句并且返回的值为非对象的-基本类型,那么依旧以构建的实例对象作为new操作的结果返回
如果有使用return语句并且返回的值为对象的-非基本类型,那么以次对象作为new操作的结果返回

给个例子

function F(){
    this.name="I am created by F";
    function C(){
      console.log(this);
      return 123;
    }
    
    return C();
  }
var o = new F();

此时的o就为F的实例对象
console.log(o.name);//输出结果为 I am created by F

function F(){
    this.name="I am created by F";
    function C(){
      console.log(this);
      return {
       name:“I'm created by C"
      };
    }
    
    return C();
  }
var o = new F();

此时的o就为函数C返回的对象
console.log(o.name);//输出结果为 I'm created by C

ringa_lee

function 中的 this ,没有用 new 创建新对象,就是指向全局的,除非用 applycall 覆盖

PHP中文网

看 console 的结果的确是指的是全局,但不知该怎么解释。

怪我咯

这个this 是全局对象,thisC 中,主要看C如果如何调用,而C() 就是一般的函数调用,所以this是window。
http://zonxin.github.io/post/2015/11/javascript-this/

迷茫

this指向取决其执行的环境,不是声明的环境。

ringa_lee

高程3 144页 构造函数 new的过程:
1 创建一个新对象
2 将构造函数的作用域赋给新对象(this就指向了这个新对象)
3 执行构造函数中的代码(为这个新对象添加属性)
4 返回新对象

黄舟

我觉得是 类似这样 function foo(){} 定义函数, 并且不把它赋值到某个实例的属性上时, 执行它的宿主应该就是全局对象。然后结合 @kikong 的回答就能理解了。
这篇 文章 可能对你有帮助

大家讲道理

很显然是全局变量啊

this的指向始终是调用者,因为javascript中this是lazy bind,始终在被调用时才确定this的指向

题主的问题:

new F()的时候,C()确实被执行了,但是C()是被当作函数调用,而不是方法,也就是调用者是null,
所以this的指向就是window

如果想要指向当前的对象,可以这样:

声明函数的时候

function C(){
      console.log(this);
      return this;
    }.bind(this)

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

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