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例题的一篇。

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

  

 

  

原文地址:https://www.cnblogs.com/hjj2ldq/p/9310208.html