说一下 this 的指向
普通函数的this
作为函数在全局调用,this的指向是window
var name = '卡卡'; function cat() { var name = '有鱼'; console.log(this.name);//卡卡 console.log(this);//window } cat();
作为对象中的某个方法被调用,this指向该对象
一层作用域链
var name = '卡卡'; var cat = { name: '有鱼', eat: function () { console.log(this.name); // 因为函数eat是由cat对象调用的,所以this指向的是cat本身,所以cat.name=有鱼; console.log(this);//{name: '有鱼', eat: ƒ} } } cat.eat();
多层作用域链时,this指向最近的
var name = '卡卡'; var cat = { name: '有鱼', eat1: { name: '年年', eat2: function () { console.log(this.name);//年年 console.log(this);//{name: '年年', eat2: ƒ} } } } cat.eat1.eat2();
构造函数的调用,this指向实例化新对象
var name = '卡卡'; function Cat(name) { this.name = name; console.log(this) } var cat1 = new Cat('有鱼');//Cat {name: '有鱼'} console.log(cat1.name);// 有鱼
匿名函数的调用,this指向全局对象
var name = '卡卡'; var cat = { name:'有鱼', eat:(function(){ console.log(this.name);//卡卡 })() } cat.eat;
箭头函数的this
全局函数下
const global = () => { console.log(this);//Window } global();
对象方法中
定义箭头函数的作用域的this指向谁,箭头函数的this就指向谁
const Person = { realname: '张三', age: 19, say: () => { console.log(this);//Window } } Person.say();//window
构造函数中
指向当前实例,就是新建对象本身,箭头函数this一旦定义就不能改变
function Person(realname, age) { this.realname = realname; this.age = age; this.say = () => { console.log(this); } this.say1 = function () { console.log(this); } } const P1 = new Person('张三', 19); const P2 = new Person('李四', 20); P1.say(); //Person {realname: "张三", age: 19, say: ƒ, say1: ƒ} P2.say(); //Person {realname: "李四", age: 20, say: ƒ, say1: ƒ} P1.say.call(P2);//Person {realname: "张三", age: 19, say: ƒ, say1: ƒ} P1.say1.call(P2);//Person {realname: "李四", age: 20, say: ƒ, say1: ƒ}
箭头函数相较于普通函数
- 箭头函数都是匿名函数,普通函数有匿名也有具体名函数
- 箭头函数不能用于构造函数,不能new
- 箭头函数this永远指向其上下文this,任何方法改变不了其指向
分类:
js
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用