这段代码的this指向的是谁?

savokiss
  • 6.2k

代码:

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

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

怎么理解呢?

回复
阅读 2.2k
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

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

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

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

高程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);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏