1. var obj = {
    2. a: 1,
    3. fire: function () {
    4. console.log(this.a)
    5. }
    6. }
    7. obj.fire(); // 输出1

    当函数被一个对象“包含”的时候,我们称函数的this被隐式绑定到这个对象里面了,这时候,通过this可以直接访问所绑定的对象里面的其他属性,比如上面的a属性

    1. function fire () {
    2. console.log(this.a)
    3. }
    4. var obj = {
    5. a: 1,
    6. fire: fire
    7. }
    8. obj.fire(); // 输出1
    9. // 我是第二段代码
    10. var obj = {
    11. a: 1,
    12. fire: function () {
    13. console.log(this.a)
    14. }
    15. }
    16. obj.fire(); // 输出1

    这2种写法达到的效果是相同的
    fire函数并不会因为它被定义在obj对象的内部和外部而有任何区别,也就是说在上述隐式绑定的两种形式下,fire通过this还是可以访问到obj内的a属性,这告诉我们:

    1. this是动态绑定的,或者说是在代码运行期绑定而不是在书写期
    2. 函数于对象的独立性, this的传递丢失问题

    基于this动态绑定的特点,写在对象内部,作为对象属性的函数,对于这个对象来说是独立的。(函数并不被这个外部对象所“完全拥有”)
    我想表达的意思是:在上文中,函数虽然被定义在对象的内部中,但它和“在对象外部声明函数,然后在对象内部通过属性名称的方式取得函数的引用”,这两种方式在性质上是等价的(而不仅仅是效果上)

    定义在对象内部的函数只是“恰好可以被这个对象调用”而已,而不是“生来就是为这个对象所调用的”

    1. var obj = {
    2. a: 1, // a是定义在对象obj中的属性 1
    3. fire: function () {
    4. console.log(this.a)
    5. }
    6. }
    7. var a = 2; // a是定义在全局环境中的变量 2
    8. var fireInGrobal = obj.fire;
    9. fireInGrobal(); // 输出 2

    上面这段简单代码的有趣之处在于: 这个于obj中的fire函数的引用( fireInGrobal)在调用的时候,行为表现(输出)完全看不出来它就是在obj内部定义的,其原因在于:我们隐式绑定的this丢失了!! 从而 fireInGrobal调用的时候取得的this不是obj,而是window

    var a = 2; // 全局
    var obj = {
     a: 1, // a是定义在对象obj中的属性
     fire: function () {
       console.log(this.a)
      }
    } 
    function otherFire (fn) {
      fn();
    } 
    otherFire(obj.fire); // 输出2
    

    关键角色是otherFire函数,它接受一个函数引用作为参数,然后在内部直接调用,但它做的假设是参数fn仍然能够通过this去取得obj内部的a属性,但实际上, this对obj的绑定早已经丢失了,所以输出的是全局的a的值(2),而不是obj内部的a的值(1)