this在不同情况的指向问题
------------恢复内容开始------------
全局环境:
无论是否在严格模式下,在全局执行环境中,(任何函数体外部)this都指向全局对象。
// 在浏览器中, window 对象同时也是全局对象: console.log(this === window); // true a = 37; console.log(window.a); // 37 this.b = "MDN"; console.log(window.b) // "MDN" console.log(b) // "MDN"
函数(运行内)环境:
在函数内部,this的值取决于函数被调用的方式。普通函数内部的this分两种情况,严格和非严格模式。
- 非严格模式下,this默认指向全局对象window。
function f1(){ return this; } //在浏览器中: f1() === window; //在浏览器中,全局对象是window //在Node中: f1() === global;
- 在严格模式下,this将会默认为undefined
function f2(){ "use strict"; // 这里是严格模式 return this; } f2() === undefined; // true
作为对象的方法:
当函数作为对象里的方法被调用时,它们的this是调用该函数的对象。
- 函数的定义位置不影响其this指向,this指向只和调用函数的对象有关。
- 多层嵌套的对象,内部方法的this只想被调用函数最近的对象(window也是对象,其内部对象调用方法的this指向内部对象,而非window)
var o = { prop: 37, f: function() { return this.prop; } }; console.log(o.f()); // logs 37
请注意,这样的行为,根本不受函数定义方式或位置的影响。在前面的例子中,我们在定义对象o
的同时,将函数内联定义为成员 f
。但是,我们也可以先定义函数,然后再将其附属到o.f
。这样做会导致相同的行为:
var o = {prop: 37}; function independent() { return this.prop; } o.f = independent; console.log(o.f()); // logs 37
this出现的场景分为四类
1、有对象就指向调用对象
2、没调用对象就指向全局对象:window是js中的全局对象
3、用new构造就指向新对象
4、通过apply或者call或bind来改变this的指向
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律