由于函数是一个单独的值,所以它可以在不同的环境(上下文)执行 。
文章插图
4 环境变量JavaScript 允许在函数体内部,引用当前环境的其他变量 。
文章插图
上面代码中,函数体里面使用了变量x 。该变量由运行环境提供 。
现在问题就来了,由于函数可以在不同的运行环境执行,所以需要有一种机制,能够在函数体内部获得当前的运行环境(context) 。所以,this就出现了,它的设计目的就是在函数体内部,指代函数当前的运行环境 。
文章插图
上面代码中,函数体里面的this.x就是指当前运行环境的x 。
var f = function () {console.log(this.x);}var x = 1;var obj = {f: f,x: 2,};// 单独执行f() // 1// obj 环境执行obj.f() // 2
上面代码中,函数f在全局环境执行,this.x指向全局环境的x 。文章插图
在obj环境执行,this.x指向obj.x 。
文章插图
回到本文开头提出的问题,obj.foo()是通过obj找到foo,所以就是在obj环境执行 。一旦var foo = obj.foo,变量foo就直接指向函数本身,所以foo()就变成在全局环境执行 。
参考
- Javascript 的 this 用法
- JavaScript 的 this 原理
【一文看懂Javascript的this关键字】
推荐阅读
- 人脸识别JavaScript也可以轻松搞定
- 一文详解 C++ 框架:日志框架
- 亡羊补牢告诉我们只要及时改正-亡羊补牢一文告诉我们的道理是只要肯接受意见认真改正-
- 一文彻底读懂MySQL事务的四大隔离级别
- 最新的JavaScript核心语言标准
- JavaScript前端各种文件下载功能的实现
- 一通百通,一文实现灵活的 K8S 基础架构
- JavaScript两个快速调试的技巧
- 一文带你了解搜索功能设计
- 20个常用的JavaScript简写技巧