(二)重新开始认识this

this全面解析(你不知道的javaScript,笔记)

(二)重新开始认识this

1.理解调用位置,决定了this的绑定
调用位置就是函数在代码被调用的位置,而不是声明的位置,分析调用栈获取。
在这里插入图片描述
在这里插入图片描述

2.绑定规则

2.1默认绑定
在这里插入图片描述
foo的是不带任何修饰的函数引用进行调用的,this使用默认绑定规则指向全局对象(非严格模式)
2.2隐式绑定
在这里插入图片描述
当函数引用有上下文对象时,隐式绑定会把函数调用中的this绑定到这个上下文对象。调用位置会使用obj上下文来引用函数,函数被调用时obj对象“拥有”或“包含”它。
但是对象属性引用链中只有最顶层或最后一层会影响调用位置
在这里插入图片描述
隐式丢失问题
1.被隐式绑定的函数对象会丢失绑定对象运用默认绑定,绑定到全局对象(非严格模式)或者undefined(严格模式)上
在这里插入图片描述
这个需要了解引用类型的数据,赋值的是引用地址,所以bar是obj.foo的引用,但是实际上,它引用的是foo函数本身,因此此时的bar()其实是一个不带任何修饰的函数调用,因此应用了默认绑定。
2.另一种丢失发生在传入回调函数时:
在这里插入图片描述
参数传递其实就是隐式赋值,因此我们传入函数时也会被隐式赋值,和1的结果一样。
2.3显式绑定
函数call,apply,bind方法
显式绑定的硬绑定解决丢失问题

function foo(){
console.log(this.a)
}
var obj={
	a:2
}
var bar=function(){
	foo.call(obj)
}
bar() ///2
setTimeout(bar,100) //2
//硬绑定的bar不可能再修改它的this
bar.call(window) //2

forEach第二个参数可指定this绑定对象
2.4 new绑定
在这里插入图片描述

优先级

new绑定,显式绑定,隐式绑定,默认绑定
在这里插入图片描述

规则应用的例外

把null或undefined作为this的绑定对象传入call,apply,bind,这些值在被调用时会被忽略,应用的是默认绑定规则。
应用:使用apply来展开一个数组

function foo(a,b){
	console.log("a":+a+",b:"+b)
}
foo.apply(null,[2,3])  //a:2,b:3  	ES6	中可以扩展运算符...,foo(...[2,3])
使用bind()进行柯里化
var bar=foo.bind(null,2);
bar(3) //a:2,b:3

更安全的做法是传入一个空对象,不会对全局对象有影响
创建空对象:Object.create(null),不会创建Object.prototype
间接引用
在这里插入图片描述

箭头函数
在这里插入图片描述
foo内部创建的箭头函数会捕获调用时foo()的this。由于foo()的this绑定到obj1,bar(引用箭头函数)的this也会绑定到obj1,箭头函数的绑定无法修改。

下面是一个简单的示例代码,实现了在Qt中重新开始五子棋游戏: ```cpp // 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPushButton> #include <QMessageBox> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void handleButtonClicked(); private: Ui::MainWindow *ui; QPushButton *restartButton; // 其他成员函数和变量等 }; #endif // MAINWINDOW_H // 源文件 #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); restartButton = new QPushButton("重新开始", this); restartButton->setGeometry(10, 10, 100, 30); connect(restartButton, SIGNAL(clicked()), this, SLOT(handleButtonClicked())); // 初始化其他成员函数和变量等 } MainWindow::~MainWindow() { delete ui; } void MainWindow::handleButtonClicked() { // 重新开始游戏的逻辑,例如初始化游戏状态 QMessageBox::information(this, "消息", "游戏已重新开始!"); } ``` 这个示例代码是一个基于Qt的五子棋游戏的主窗口类。通过点击"重新开始"按钮,会触发`handleButtonClicked()`槽函数。在该函数中,可以实现重新开始游戏的逻辑,例如初始化游戏状态、清空棋盘等操作。最后,通过`QMessageBox::information()`函数弹出一个消息提示框,显示游戏已重新开始的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值