扫码关注官方订阅号
代码:
function F(){ function C(){ console.log(this); return this; } return C(); } var o = new F();
上面的this指向的是全局对象还是对象o?
this
怎么理解呢?
学习是最好的投资!
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操作的结果返回
console.log(this);
var o=new F();
给个例子
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 创建新对象,就是指向全局的,除非用 apply 或 call 覆盖
function
new
apply
call
看 console 的结果的确是指的是全局,但不知该怎么解释。
这个this 是全局对象,this在 C 中,主要看C如果如何调用,而C() 就是一般的函数调用,所以this是window。http://zonxin.github.io/post/2015/11/javascript-this/
C
this指向取决其执行的环境,不是声明的环境。
高程3 144页 构造函数 new的过程:1 创建一个新对象2 将构造函数的作用域赋给新对象(this就指向了这个新对象)3 执行构造函数中的代码(为这个新对象添加属性)4 返回新对象
我觉得是 类似这样 function foo(){} 定义函数, 并且不把它赋值到某个实例的属性上时, 执行它的宿主应该就是全局对象。然后结合 @kikong 的回答就能理解了。这篇 文章 可能对你有帮助
function foo(){}
很显然是全局变量啊
this的指向始终是调用者,因为javascript中this是lazy bind,始终在被调用时才确定this的指向
题主的问题:
在new F()的时候,C()确实被执行了,但是C()是被当作函数调用,而不是方法,也就是调用者是null,所以this的指向就是window
new F()
C()
如果想要指向当前的对象,可以这样:
声明函数的时候 function C(){ console.log(this); return this; }.bind(this) 或者在调用函数的时候 C.apply(this);
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
在函数对象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操作的结果返回
给个例子
此时的o就为F的实例对象
console.log(o.name);//输出结果为 I am created by F
此时的o就为函数C返回的对象
console.log(o.name);//输出结果为 I'm created by C
function中的this,没有用new创建新对象,就是指向全局的,除非用apply或call覆盖看 console 的结果的确是指的是全局,但不知该怎么解释。
这个this 是全局对象,
this在C中,主要看C如果如何调用,而C() 就是一般的函数调用,所以this是window。http://zonxin.github.io/post/2015/11/javascript-this/
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
如果想要指向当前的对象,可以这样: