以下内容来自《你不知道的js》读书笔记

this提供了一种更优雅的方式来隐式“传递”一个对象引用,因此可以将API设计得更加简洁并且易于复用。

this与函数的调用位置有关。

一、 this的绑定规则

  • 默认绑定
  • 隐式绑定
  • 显示绑定
  • new绑定

1. 默认绑定:即独立函数调用,this会绑定到全局对象上(非严格模式)

function foo(){console.log(this.a); // 2
}
var a=2;
foo();
注意:
对于默认绑定来说,决定this绑定对象的并不是调用位置是否处于严格模式,而是**函数体是否处于严格模式**。如果函数体处于严格模式,this会被绑定到undefined,否则this会被绑定到全局对象。

2. 隐式绑定:调用位置是否有上下文对象,this会被绑定到这个上下文对象。

function foo(){console.log(this.a);
}
var obj={a: 2,foo: foo
}obj.foo();// 2
注意:
1.对象属性引用链中只有上一层或者说最后一层在调用位置中起作用,即obj.obj2.foo(),那么foo中的this被绑定到了obj2上。
2.隐式丢失:被隐式绑定的函数会丢失绑定对象,也就是说它会应用默认绑定,从而把this绑定到全局对象或者undefined上,取决于是否是严格模式。(1)将函数赋值给其他变量(2)函数作为另外一个函数的参数传递进去(严格意义上也属于(1))function foo(){console.log(this.a);// 42,发生了隐式丢失}var obj={a: 2,foo: foo}var a = 42;var foo2=obj.foo;foo2();

3. 显示绑定:可以直接指定this的绑定对象

  • call、apply
function foo(){console.log(this.a);
}
var obj={a: 2
}
foo.call(obj);// 2
  • 以下两种方式可解决丢失绑定问题:

    • 硬绑定:bind(硬绑定后的this不能再次修改)
    function foo(something){console.log(this.a, something);return this.a + something;
    }
    var obj={a: 2};
    var bar = foo.bind(obj);
    var b = bar(3);// 2, 3
    console.log(b);// 5
    
    • API调用的“上下文”:第三方库的许多函数,以及JavaScript语言和宿主环境中许多新的内置函数,都提供了一个可选的参数,通常被称为“上下文”

4. new绑定:在JavaScript中,构造函数只是一些使用new操作符时被调用的普通函数。

  • 创建(或者说构造)一个全新的对象。
  • 这个新对象会被执行[[Prototype]]连接。
  • 这个新对象会绑定到函数调用的this。
  • 如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象。

注意:this绑定的优先级:
new绑定 > 显示绑定 > 隐式绑定 > 默认绑定

5. 箭头函数:不会使用以上四条标准的绑定规则,根据当前的词法作用域来决定this

二、 绑定例外

  • 被忽略的this:如果你把null或者undefined作为this的绑定对象传入call、apply或者bind,这些值在调用时会被忽略,实际应用的是默认绑定规则。
  • 间接引用:你有可能(有意或者无意地)创建一个函数的“间接引用”,在这种情况下,调用这个函数会应用默认绑定规则。
function foo(){console.log(this.a);
}
var a = 2;
var o={a: 3, foo:foo};
var p={a:4};o.foo();//3
(p.foo=o.foo)();// 2
// 赋值表达式p.foo = o.foo的返回值是目标函数的引用,因此调用位置是foo()而不是p.foo()或者o.foo()。根据我们之前说过的,这里会应用默认绑定。
  • 软绑定:和硬绑定相同的效果,同时保留隐式绑定或者显式绑定修改this的能力。
    如果this绑定到全局对象或者undefined,那就把指定的默认对象obj绑定到this,否则不会修改this
if(!Function.prototype.softBind){Function.prototype.softBind=function(obj){var fn=this;var curried=[].slice.call(arguments, 1);var bound=function(){return fn.apply((!this || this === (window || global)) ? obj : this,curried.concat.apply(curried, arguments))};bound.prototype=Object.create(fn.prototype);return bound;}
}

希望大家能持续关注哦,留一些个人信息方便大家找到我哦。知乎 github
附上个人公众号哦,希望大家前来骚扰(也会经常写一些随笔来记录生活,毕竟人生漫漫)

详解js的this指向问题相关推荐

  1. python获取mysql中的数据供js调用_详解js文件通过python访问数据库方法

    我来教你 js文件怎么通过python访问数据库,希望能够为你带来帮助. 1.如果是要提交表单内容给 服务器的 python 处理,那么只需要在表单 里面的 action 填写服务端的处理路由就可以了 ...

  2. 详解 js 函数中的 arguments

    详解 js 函数中的 arguments 1.什么 arguments 简单来说:arguments 是一个对应于传递给函数的参数的类数组对象 arguments 对象是所有(非箭头)函数中都可用的局 ...

  3. 详解JS原型链与继承

    详解JS原型链与继承 JavaScript 目录 摘自JavaScript高级程序设计: 概念 确定原型和实例的关系 原型链的问题 借用构造函数 组合继承 原型继承 寄生式继承 寄生组合式继承 new ...

  4. 详解js中的继承(一)

    详解js中的继承(一) 前言 准备知识 1.构造函数,实例 2.原型对象 3.构造函数,原型对象和实例的关系 继承 原型链 小结 前言 通过[某种方式]让一个对象可以访问到另一个对象中的属性和方法,我 ...

  5. 详解JS中的Object

    详解 JS 中的 Object 从本质上看,Object 是一个构造函数,用于创建对象. 一.Object 构造函数的属性 在 Object 中声明的属性只有两个: Object.length -- ...

  6. socket服务器断开消息,详解JS WebSocket断开原因和心跳机制

    1.断开原因 WebSocket断开的原因有很多,最好在WebSocket断开时,将错误打印出来. ws.onclose = function (e) { console.log('websocket ...

  7. php js实现流程图,详解js中构造流程图的核心技术JsPlumb(2)_javascript技巧

    前言:上篇详解js中构造流程图的核心技术JsPlumb介绍了下JsPlumb在浏览器里面画流程图的效果展示,以及简单的JsPlumb代码示例.这篇还是接着来看看各个效果的代码说明. 一.设置连线的样式 ...

  8. 详解js对称加密和非对称加密

    详解js对称加密和非对称加密 https保证数据在传输过程中不被窃取和篡改,从而保证传输安全 1.加密 对称加密:产生一个密钥,可以用其加密,可以用其加密,也可以用其加解密. 这个密钥可以是任何东西, ...

  9. linux 弹出窗口,实现弹出窗口的window.open用法详解(js代码)

    实现弹出窗口的window.open用法详解(js代码) [1.最基本的弹出窗口代码] 其实代码非常简单: 因为这是一段javascripts代码,所以它们应该放在 cript">标签 ...

最新文章

  1. Ubuntu环境下TensorFlow 的环境搭建(一)安装Anaconda
  2. Codeforces 671D. Roads in Yusland(树形DP+线段树)
  3. [Swift]LeetCode551. 学生出勤纪录 I | Student Attendance Record I
  4. 剖析ASSERT函数
  5. Jzoj5245 Competing Souls
  6. echarts里面的参数解释_SPMSM控制:传统PI速度环参数的整定
  7. Windows核心编程_LOG软件
  8. python八大排序算法_Python实现八大排序算法
  9. Matlab中的ttest2()函数实现
  10. Android手机安全软件的恶意程序检测靠谱吗--LBE安全大师、腾讯手机管家、360手机卫士恶意软件检测方法研究...
  11. SpringBoot实现163邮箱发送邮件
  12. Java Web课程设计
  13. 苹果你深深的伤害了我,还不让我说
  14. 如果长颈鹿哭了,它会不会要哽咽好久
  15. 解决Android WebVIew中视频播放前出现的灰色三角形播放图标
  16. 为什么CMOS门电路在传输过程存在延时
  17. 计算机超级工作站,【八核高性能计算超级计算机CAECADCAM有限元超级工作站】.docx...
  18. 利用定时器实现PWM波对Zigbee(CC2530)上LED亮度进行强弱调整
  19. 基于SSM框架的音乐网站系统设计与实现
  20. 年会弹幕文字_弹幕软件_互动游戏/活动管理平台/年会必备工具

热门文章

  1. 深入学习USB(7)认识笔记本上USB接口的标识
  2. [经验] 【emWin实战教程V2.0】第8章 emWin5.32模拟器的使用方法
  3. 通知|百度1+X区块链系统应用与设计职业技能等级证书(初、中级)线上师资普及培训班...
  4. vue图片img加载失败显示自定义默认图片(缺省图)
  5. 学堂在线《工程伦理》第十二章课后习题及答案(仅供参考)
  6. 蓝绿大厂之争,国产手机逆袭除了自研芯片还能靠啥?
  7. css文字特效-冰冻文字(带炫光)
  8. 记录pyinstaller打包过程中遇到的坑
  9. 软银开放Pepper开发,给机器人写安卓App是怎样一种体验?
  10. 怎么将ChatGPT接入微信