function MyObject() {
this.value = 42;
// 匿名函数
this.anonymousFunction = function () {
console.log(this.value, this); // 这里的this指向MyObject的实例
};
// 箭头函数
this.arrowFunction = () => {
console.log(this.value, this); // 这里的this也指向MyObject的实例,因为箭头函数捕获了外部函数的this
// cb:这里的this创建实例的时候已经指向了实例,其他作用域调用这个函数,this一直指向该实例
};
}
const obj = new MyObject();
obj.anonymousFunction(); // 输出: 42
obj.arrowFunction(); // 输出: 42
// 如果作为回调函数使用
setTimeout(obj.anonymousFunction, 1000); //cb这里是把这个函数的引用放在这,调用的对象是window ,this指向了window
setTimeout(() => {
// const a=obj.anonymousFunction
// a()
obj.anonymousFunction(); //cb:this主要是由调用对象决定的,这里的调用对象是obj,上面两行调用的是window
// cb:一.这里的箭头函数只是作为一个回调函数,给需要执行的函数搭建一个全局作用域的环境(此环境this指向window)
//实现了调用的函数可以选择它的调用对象
}, 1000);
setTimeout(obj.arrowFunction, 1000); // 输出: 42,因为箭头函数捕获了外部this
//cb:箭头函数在实例化对象时绑定了该实例的this,不再改变
//cb:箭头函数在写完代码的时候它的this已经确定了,跟它所处的作用域的this绑定了,不再改变和作用域的this保持一致;
// 如果改变了,说明它处的作用域发生了变化,而作用域变化主要是普通函数的调用对象不同导致的
let kkx=obj.arrowFunction // cb:二、实例化对象时,箭头函数已经绑定了该对象,此时this不再改变
kxx()
- 这里的箭头函数只是作为一个回调函数,给需要执行的函数搭建一个全局作用域的环境(此环境this指向window),实现了调用的函数可以选择它的调用对象
- 实例化对象时,箭头函数已经绑定了该对象,此时this不再改变,不管在任何作用域下调用都指向绑定的实例
const obj = { value: 10, method: function () { console.log(this.value); // 这里 "this" 指向 obj // 定义一个箭头函数作为回调函数 setTimeout(() => { console.log(this.value); // 这里 "this" 同样指向 obj,因为箭头函数捕获了外部函数的 "this" // cb:外部函数指的是method这个匿名函数 }, 1000); return () => { console.log(this.value, this, 123); }; }, arrowFunc: () => { console.log(this.value); // 这里 "this" 不会指向 obj,而是指向全局对象(在浏览器中是 window) }, kkx: this,// 当前作用域this指向window }; // 调用方法 obj.method(); // 输出:10(两次,因为setTimeout中的箭头函数也捕获了相同的 "this") // 尝试调用箭头函数 obj.arrowFunc(); // 输出:undefined(在严格模式下) // 注意:这里的 "this" 不指向 obj,因为箭头函数在定义时并没有绑定到 obj 的上下文 // cb:一、寻找箭头函数的this,要看当前作用域的this // cb:全局作用域:this指向window;具名函数作用域: this指向调用它的对象;块级作用域:this指向window // cb:所以如果想要修改箭头函数的this,就把它放在某个具名函数的作用域内 // cb:这样当具名函数的this发生变化了,箭头函数的this也随之改变了 // 为了证明箭头函数不绑定自己的 "this",我们可以在全局作用域中定义一个变量 window.value = "global"; // 假设我们在浏览器环境中 obj.arrowFunc(); // 输出:'global'(在浏览器环境中,箭头函数捕获了全局对象的 "this") console.log(obj.kkx); // 输出:window全局对象 const aw = obj.method; const ao = obj.method(); console.log(ao(), aw()()); //cb:二、通过具名函数作用域变化,箭头函数绑定this以后不再改变
- 寻找箭头函数的this,要看当前作用域的this
全局作用域 this指向window,非箭头函数作用域 this指向调用它的对象,块级作用域 this指向window
词法作用域意味着代码写完了作用域就确定了,所以如果想要修改箭头函数的this,就把它放在某个具名函数的作用域内
这样当具名函数的this发生变化了,箭头函数的this也就改变了 - 通过非箭头函数作用域变化,箭头函数绑定this以后不再改变