《你不知道的JavaScript-上卷》第一部分-附录C-笔记-this词法

箭头函数

js 复制代码
var foo = a => {
    console.log( a );
};

foo( 2 ); // 2

箭头函数修复了this指向的一个问题。问题代码如下

js 复制代码
    var obj = {
      id: "awesome",
      cool: function coolFn() {
        console.log(this.id);
      }
    };
    var id = "not awesome"
    obj.cool(); // 酷
    setTimeout(obj.cool, 100); // 不酷 这里的this指向window,没有指向obj

旧的修复方式1,通过闭包来解决

  • 使用self变量引用声明时指向的this
js 复制代码
    var obj = {
      count: 0,
      cool: function coolFn() {
        var self = this;
        if (self.count < 1) {
          setTimeout(function timer() {
            self.count++;
            console.log("awesome?");
          }, 100);
        }
      }
    };
    obj.cool(); // awesome?

箭头函数也可以修复这个this绑定问题

  • 箭头函数在涉及 this 绑定时的行为和普通函数的行为完全不一致
  • 是用当前的词法作用域覆盖了 this 本来的值
  • 这个代码片段中的箭头函数"继承"了 cool() 函数的 this 绑定(因此调用它并不会出错)。
js 复制代码
    var obj = {
      count: 0,
      cool: function coolFn() {
        if (this.count < 1) {
          setTimeout(() => { // 箭头函数是什么鬼东西?
            this.count++;
            console.log("awesome?");
          }, 100);
        }
      }
    };
    obj.cool(); // awesome?

还有一种旧的修复方式,就是使用函数的bind方法,进行this绑定

js 复制代码
    var obj = {
      count: 0,
      cool: function coolFn() {
        if (this.count < 1) {
          setTimeout(function timer() {
            this.count++; // this 是安全的
            // 因为 bind(..)
            console.log("more awesome");
          }.bind(this), 100); // look, bind()!
        }
      }
    };
    obj.cool(); // more awesome
相关推荐
卸任7 小时前
Vibe coding工具使用心得
前端·ai编程
brien98 小时前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
修炼的dance8 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M8 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写8 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李8 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易8 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
清晨Coding8 小时前
删了 Cookie 还能自动登录?Google系网站登录态自动恢复的原理分析
javascript
风骏时光牛马8 小时前
前沿视界
前端
kyriewen9 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员