欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js中的this理解

程序员文章站 2022-03-29 17:51:40
...

本篇参考多篇网文, 记录自己对这个问题的理解。

  1. 为什么要这么设计?

由于函数可以在不同的运行环境执行,所以需要有一种机制,能够在函数体内部获得当前的运行环境(context)。所以,this就出现了,它的设计目的就是在函数体内部,指代函数当前的运行环境。(不是函数定义时的环境)。

  1. 为什么函数可以在不同的运行环境执行?

这个跟js是动态语言有关系。
静态编译的语言,会用固定地址替代函数名。程序运行的时候,函数名是不会参与执行的。而在js这种解释型语言中,变量(指向函数的变量)和函数实现完全可以是两个不同的运行实体。

变量(指向函数的变量)拥有自己的类型,还需要分配内存,变量(指向函数的变量)可以参与程序执行。

函数在其中只是一个单独的值,它可以在不同的环境(上下文)执行。
意思就是说函数可以作为地址,可以由不同的变量名指向。
真正的上下文由当前指向函数的变量(的上下文)决定。

var f = function () {};
var obj = { f: f };

// 全局环境执行
f()

// obj 环境执行
obj.f()

var fn = obj.f
// 全局环境执行
fn()
  1. this的搜索范围与普通变量有什么不同?

函数在被调用时,自动取得两个特殊变量this和arguments。
函数体内在搜索这两个变量时只会搜索自己当前的上下文环境,而不是像其它普通变量一样通过作用域向上搜索。

  1. 匿名函数和自执行函数的this又是怎么判断的?

匿名函数的运行上下文是全局环境,
自执行函数的运行上下文也是全局环境。
我的理解是,这些函数的执行,都是解释器自动为他们分配了指向的函数名,而这个函数名是全局的。

参考:
http://www.ruanyifeng.com/blog/2018/06/javascript-this.html