• this以及执行上下文概念的重新认识


    在理解this的绑定过程之前,必须要先明白调用位置,调用位置指的是函数在代码中被调用的位置,而不是声明所在的位置。

    (ES6的箭头函数不在该范围内,它的this在声明时已经绑定了,而不是取决于调用时。所以导致它没有arguments,不能做构造函数,更不能new,bind,call也不能改变它的this)

    而很多情况下调用位置往往是隐式的,所以我们在函数调用位置就要明确它的调用栈。

    function baz() {
        // 当前调用栈是:baz
        // 因此,当前调用位置是全局作用域
        console.log( "baz" );
        bar(); // <-- bar 的调用位置 
    }
    function bar() { 82
        // 当前调用栈是 baz -> bar
        // 因此,当前调用位置在 baz 中
       console.log( "bar" );
        foo(); // <-- foo 的调用位置 
    }
    function foo() {
        // 当前调用栈是 baz -> bar -> foo // 因此,当前调用位置在 bar 中
        console.log( "foo" );
         }
    baz(); // <-- baz 的调用位置

    这里你可以把调用栈理解成函数调用链。

    默认绑定:指的是window调用函数

    function foo() { 
        console.log( this.a );
    }
       
    var a = 2;
    foo(); // 2  

    在严格模式下

    function foo() {
     "use strict";
      console.log( this.a );
    }
    var a = 2;
    foo(); // TypeError: this is undefined
    

    结果是完全不同的,我们在严格模式那一章讲到过。function foo() { console.log( this.a );

    }
    var obj2 = { 
        a: 42,
        foo: foo
     };
    var obj1 = {
         a: 2,
        obj2: obj2 
    };
    obj1.obj2.foo(); // 42
    对象属性引用链中只有上一层或者说最后一层在调用位置中起作用。
    总结:常见的误解是:把this看成指向函数本身或者函数的作用域。如文章开头提到的,它并不是在编写时绑定的,

    它的上下文取决于函数调 用时的各种条件。this 的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。

    原文经典名句:当一个函数被调用时,会创建一个活动记录(有时候也称为执行上下文)。这个记录会包 含函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息。this 就是这个记 录的一个属性,会在函数执行的过程中用到。

    具体的this解析例子这里就不多提了,可以翻一下我以前写的关于this例题的一篇。

    写这篇笔记最主要就是想记下上面的那句名句而已,让人耳目一新。

      

     

      

  • 相关阅读:
    ASP连接mysql
    jsp中动态include与静态include的区别
    Create & Post free text invoice by code
    自定义Form作为Dialog
    动态多关联查询
    转到主表窗口
    获取当前用户组
    一个Job调用另外一个Job
    保存图片到硬盘
    在编辑框中增加右键菜单
  • 原文地址:https://www.cnblogs.com/hjj2ldq/p/9310208.html
Copyright © 2020-2023  润新知