zoukankan      html  css  js  c++  java
  • 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例题的一篇。

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

      

     

      

  • 相关阅读:
    Python--json处理
    Python--加密模块
    Python--函数即变量
    bzoj 2276: [Poi2011]Temperature
    1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛
    2017 9 15 noip模拟赛
    bzoj 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛
    2017 9 11 noip模拟赛T2
    URAL 1613. For Fans of Statistics (2017 9 6 noip模拟赛T3)
    codeforces 105 B. Dark Assembly(birbe贿赂 noip模拟赛)
  • 原文地址:https://www.cnblogs.com/hjj2ldq/p/9310208.html
Copyright © 2011-2022 走看看