函数执行的主体(不是上下文):谁把函数执行的,执行主体就是谁
    this的使用规律:

    1. 给元素的某个事件绑定方法,当事件触发方法执行的时候,方法中的this是当前操作的元素本身
    1. function fn(n,m){
    2. this.total=n+m;
    3. }
    4. let obj={name:'OBJ'};
    5. fn(10,20); //=>this:window
    6. //obj.fn(20,30); //=>报错:obj中没有fn属性
    7. document.body.onclick=fn; //=>点击后FN中的this:BODY
    8. document.body.onclick=function(){
    9. //=>this:BODY
    10. fn(30,40); //=>this:window
    11. };
    12. fn.call(); //=>this:window 不传或者传递null/undefined都是
    13. fn.call(obj,10,20); //=>this:obj
    14. fn.apply(obj,[10,20]);//=>this:obj APPLY要求传递的参数是数组
    15. document.body.onclick=fn.bind(obj,10,20); //=>BIND是预处理THIS,此时的FN还没有执行,只是把THIS改成了OBJ,点击BODY的时候才执行的 =>“柯理化函数”(预处理机制)
    1. 当方法执行时,看方法前面是否有点,没有点的话,this是window或者undefined(严格模式);有点的话,点前面是谁this就是谁。
    1. function Fn() {
    2. // ...
    3. }
    4. Fn.prototype.xxx = function () {}
    5. //=>批量给原型设置属性方法的时候:重构类的原型
    6. Fn.prototype = {
    7. constructor: Fn,
    8. getA: function () {},
    9. getB: function () {}
    10. }; */
    11. /* //=>批量给原型设置属性方法的时候:设置别名
    12. let proto = Fn.prototype;
    13. proto.getA = function () {}
    14. proto.getB = function () {}
    15. proto.getC = function () {}
    16. proto.getD = function () {} */
    17. //面向对象中有关私有/公有方法中的THIS问题
    18. * 1.方法执行,看前面是否有点,点前面是谁THIS就是谁
    19. * 2.把方法总的THIS进行替换
    20. * 3.再基于原型链查找的方法确定结果即可
    1. 构造函数执行,方法体中的this是当前类的实例
    1. function Fn() {
    2. //=>this:f1这个实例
    3. this.x = 100;
    4. this.y = 200;
    5. this.say = function () {
    6. console.log(this.x);
    7. }
    8. }
    9. Fn.prototype.say = function () {
    10. console.log(this.y);
    11. }
    12. Fn.prototype.eat = function () {
    13. console.log(this.x + this.y);
    14. }
    15. Fn.prototype.write = function () {
    16. this.z = 1000;
    17. }
    18. let f1 = new Fn;
    19. f1.say(); //=>this:f1 =>console.log(f1.x) =>100
    20. f1.eat(); //=>this:f1 =>console.log(f1.x + f1.y) =>300
    21. f1.__proto__.say(); //=>this:f1.__proto__ =>console.log(f1.__proto__.y) =>undefined
    22. Fn.prototype.eat(); //=>this:Fn.prototype =>console.log(Fn.prototype.x + Fn.prototype.y) =>NaN
    23. f1.write(); //=>this:f1 =>f1.z=1000 =>给f1设置一个私有的属性z=1000
    24. Fn.prototype.write();//=>this:Fn.prototype =>Fn.prototype.z=1000 =>给原型上设置一个属性z=1000(属性是实例的公有属性)
    1. 全局下的this指向window
    2. 回调函数中的this指向window
    3. 自执行函数中的this是window|undefined
    4. call,bind,apply改变函数中的this指向时,this为这三个的第一个参数

      每一个函数(普通函数、构造函数、内置类)都是function这个内置类的实例,因此函数._proto_===Function.prototype,函数调取Function原型上的方法

      ```javascript //Function.prototype => function anonymous(){} /*

      • call / apply / bind
      • 原型上提供的三个公有属性方法
      • 每一个函数都可以调用这个方法执行
      • 这些方法都是用来改变函数中的THIS指向的
        */ function fn(){} fn.call(); //=>fn函数基于原型链找到Function.prototype上的call方法,并且让其执行(执行的是call方法:方法中的this是fn) fn.call.call(); //=>fn.call就是Function.prototype上的call方法,也是一个函数,只要是函数就能用原型上的方法,所以可以继续调用call来执行

    Function.prototype.call = function $1(){ //… } fn.call => $1 fn.call() => $1() this:fn fn.call.call() => $1.call() => 继续让call执行,this:$1

    实例.方法():都是找到原型上的内置方法,让内置方法先执行(只不过执行的时候做了一些事情会对实例产生改变,而这也是这些内置方法的作用),内置方法中的THIS一般都是当前操作的实例

    1. 8. ES6箭头函数没有thisthis继承上下文
    2. ```javascript
    3. window.name='WINDOW';
    4. let obj={
    5. name:'OBJ',
    6. fn:()=>{
    7. console.log(this.name);
    8. }
    9. };
    10. obj.fn();//=>this:window
    11. obj.fn.call(obj);//=>this:window
    12. //==================
    13. document.body.onclick=function(){
    14. //=>this:BODY
    15. let _this=this;
    16. _this.count=0;
    17. /*setTimeout(function(){
    18. //=>this:window
    19. _this.count++;
    20. },1000);*/
    21. setTimeout(()=>{
    22. //=>this:没有自己的THIS,继承下上文中的,也就是BODY
    23. this.count++;
    24. },1000);
    25. }