当前位置: 首页 > wzjs >正文

汽车网站名称网站建设怎么问问题

汽车网站名称,网站建设怎么问问题,wordpress配置伪静态页面,手机销售网站源码JavaScript 中 this 指向详解(含多种绑定形式与陷阱) this 是 JavaScript 中用于函数执行上下文的特殊关键字,表示函数运行时的所属对象。它的指向取决于函数的调用方式。 🧠 为什么存在 this 提供统一的上下文访问机制。支持对…

JavaScript 中 this 指向详解(含多种绑定形式与陷阱)

this 是 JavaScript 中用于函数执行上下文的特殊关键字,表示函数运行时的所属对象。它的指向取决于函数的调用方式


🧠 为什么存在 this

  • 提供统一的上下文访问机制。
  • 支持对象方法复用
  • 便于类/构造函数共享行为。

🧩 一、四种 this 绑定规则详解

1️⃣ 默认绑定(Direct Function Call)

function sayHi() {console.log(this);
}
sayHi(); // 非严格模式:window;严格模式:undefined
  • 非严格模式this 指向全局对象 window
  • 严格模式thisundefined

2️⃣ 隐式绑定(Object Method Call)

const person = {name: 'Tom',greet() {console.log(this.name);}
};
person.greet(); // 输出 Tom
  • 函数通过对象调用时,this 指向该对象。
⚠️ 隐式绑定丢失示例:
const greetFn = person.greet;
greetFn(); // undefined 或 window 上的 name
  • 函数独立引用后,脱离了原对象,变为默认绑定。

3️⃣ 显式绑定(callapplybind

function introduce(lang) {console.log(`${lang}: I'm ${this.name}`);
}
const user = { name: 'Alice' };introduce.call(user, 'EN');
introduce.apply(user, ['FR']);
const boundFn = introduce.bind(user, 'CN');
boundFn();
方法是否立即执行参数传递方式
call逗号分隔参数
apply数组形式参数
bind返回绑定后的新函数

4️⃣ new 绑定(构造函数)

function Person(name) {this.name = name;
}
const p = new Person('Eve');
console.log(p.name); // Eve

等价执行流程:

function Person(name) {// this = {}this.name = name;// return this;
}

🔢 二、this 绑定优先级(从高到低)

new 绑定 > 显式绑定(bind/call/apply)> 隐式绑定 > 默认绑定
function showName() {console.log(this.name);
}
const obj = { name: 'Leo' };
const bound = showName.bind(obj);
const n = new bound(); // this 指向新创建的对象,而非 obj

🚀 三、箭头函数中的 this

const obj = {name: 'Arrow',say() {const arrowFn = () => {console.log(this.name);};arrowFn();}
};
obj.say(); // 输出:Arrow

箭头函数不会创建自己的 this

const person = {name: 'Mike',greet: () => {console.log(this.name);}
};
person.greet(); // undefined
  • this 取决于定义时的上下文,不是调用者。

🔍 四、this 在不同场景下的指向

✅ 事件监听器中

document.querySelector('#btn').addEventListener('click', function () {console.log(this); // 触发事件的元素
});
document.querySelector('#btn').addEventListener('click', () => {console.log(this); // 外层作用域(通常为 window)
});

✅ setTimeout/setInterval

setTimeout(function () {console.log(this); // window
}, 1000);

✅ class 方法

class Person {constructor(name) {this.name = name;this.sayHi = this.sayHi.bind(this);}sayHi() {console.log(this.name);}
}

或使用箭头函数:

class Person {name = 'Anna';sayHi = () => {console.log(this.name);}
}

⚠️ 五、常见陷阱与解决方案

this 丢失:异步/回调场景

const obj = {name: 'Obj',run() {setTimeout(this.say, 1000); // ❌ 默认绑定},say() {console.log(this.name);}
};
obj.run(); // undefined

✅ 解决方案:

setTimeout(this.say.bind(this), 1000);
// 或
setTimeout(() => this.say(), 1000);

✅ this 绑定规则总结表

调用方式this 指向
普通函数全局对象(非严格);undefined(严格)
对象方法该对象
箭头函数定义时的外层作用域
构造函数(new)新创建的实例对象
call/apply/bind显式传入的对象
事件监听器(function)触发事件的 DOM 元素
事件监听器(箭头)外层作用域
setTimeout/setInterval全局对象
class 方法调用者(需手动绑定)

📚 建议与技巧

  • 在回调中优先使用箭头函数,避免 this 丢失。
  • 使用 .bind(this) 或箭头函数保证类方法中 this 正确。
  • 避免函数“脱离对象”后独立调用。
  • 善用箭头函数与显式绑定,减少 this 混乱。


文章转载自:

http://fvYfBqXb.ygwbg.cn
http://6OFS2LVb.ygwbg.cn
http://PhAx14nb.ygwbg.cn
http://2E0PxG5T.ygwbg.cn
http://P2Z9PagC.ygwbg.cn
http://QkzwPgFJ.ygwbg.cn
http://0lBdezeb.ygwbg.cn
http://1HpwzxXt.ygwbg.cn
http://ikkVClub.ygwbg.cn
http://VADbBTqC.ygwbg.cn
http://UvlY49UQ.ygwbg.cn
http://FPNDiC1O.ygwbg.cn
http://ASFFTvNV.ygwbg.cn
http://ayJMsUXS.ygwbg.cn
http://QhaR1xiT.ygwbg.cn
http://E1TFXwap.ygwbg.cn
http://bOgFyLZm.ygwbg.cn
http://v1R9QPcd.ygwbg.cn
http://YQUsjfy2.ygwbg.cn
http://dWLYjdzL.ygwbg.cn
http://v8brRlPP.ygwbg.cn
http://EDjPZol4.ygwbg.cn
http://qJwnJ9B1.ygwbg.cn
http://Ld8vwvPG.ygwbg.cn
http://Ub3RHNWF.ygwbg.cn
http://YEUCxST4.ygwbg.cn
http://OF0eWdu8.ygwbg.cn
http://hGukZpdB.ygwbg.cn
http://fuOMidy5.ygwbg.cn
http://1RFlIm8i.ygwbg.cn
http://www.dtcms.com/wzjs/775592.html

相关文章:

  • 怎么做定位钓鱼网站金坛网页设计
  • 信阳网站建设制作视频的软件哪个最好免费的
  • 网站开发需求清单做网站有底薪吗
  • 书写网站建设策划书景观设计公司有哪些
  • app网站开发合同wordpress apple
  • excel可以做网站吗电脑软件推广联盟
  • 太原网站建设 网站制作wordpress分类添加自定义字段
  • 四川省住房与城乡建设厅网站官网手机房屋平面设计软件
  • 秦皇岛网站开发做网站的费用怎么做账
  • 甘肃网站建设的过程建设网贷网站
  • 自助做网站齐家网装修官网
  • 申请微官网的网站长沙做网站企业
  • 做网站比较好的公司大同工程建设信息网
  • 青岛网站建设服务器wordpress 是谁开发的
  • 河北省建设安全监督站的网站苏州品牌网站设计
  • 有哪些可以做兼职翻译的网站造价师在哪个网站做继续教育
  • 优购商城网站建设苏宁易购网站建设的不足之处
  • 做it的兼职网站支付宝网页版
  • 网站架构模式用哪种网站域名登陆
  • 响应式网站开发支持ie6解决自学摄影教程的网站有哪些
  • 中国各大网站排名邵阳汽车网站建设
  • 网站付费推广有哪些建设工程施工合同的当事人包括
  • 合肥外贸网站建设公司广州网站建设与网页设计
  • 用pc网站建设手机网站门户网站开发注意事项
  • 什么网站做h5不收费怎么做网站推广图片
  • 可信网站认证的区别怎么做软文网站
  • 做网站一年赚80亿瑞华特散热器网站谁给做的
  • 中山网站建设 骏域青海建设厅网站首页
  • 虚拟主机网站被挂马做包装设计的网站有哪些
  • 黑龙江专业网站建设免费微信小程序制作