javascript - 为什么`this`指的是父函数的作用域
问题描述
我确实读过该this
关键字可以引用全局范围或引用它的对象或事件绑定的对象,但不理解以下行为。
function outer() {
var inner = 4;
function innerFunc() {
var inner = 5;
console.log('inner called with ' + this.inner);
}
return innerFunc;
}
var obj = outer();
obj();
为什么这个日志是 4 而不是 5。AFAIKthis
应该引用它所引用的函数,并且应该可以通过closure
.
解决方案
TL;DR -this
不像你认为的那样工作。
函数的this
(也称为上下文)在调用时确定,而不是在函数定义时确定。this
这被广泛称为动态绑定,而闭包中的变量是词法绑定的。
var obj = outer();
obj();
outer
使用this = window
(或在 Node.js 的情况下)调用,global
因为您未处于严格模式(否则,this = undefined
)。outer
不使用this
,所以这不会对其产生很大影响。
outer
然后返回一个函数 ( innerFunc
),并将其分配给obj
. 然后,您再次调用obj
with this = window
(因为您没有使用.bind()
or.call()
或指定任何其他内容.apply()
)。
然后你记录this.inner
which is 等价于window.inner
which isundefined
除非你碰巧有一个inner
以某个值命名的全局变量。
那么的值this
是由调用者决定的。
如果您obj
像这样调用:
obj.call({inner: 42}); // first argument to fn.call() is the context
无论函数是如何定义的,您都会在控制台中看到 42。
推荐阅读
- seo - PrestaShop robots.txt 和 /module/ 路径索引
- macos - gfortran 出现这个 movabsq $symbol@GOTOFF 汇编程序错误的原因是什么?重定位中不支持的符号修饰符
- azure - 使用 Azure 数据工厂编排 Talend 作业/任务
- azure - 通过 Azure 门户为 Microsoft Graph 添加 Open Extension
- c++ - if语句如何及时执行?
- c# - 如何在 C# 中使用 selenium 等待页面中的两个元素中的任何一个
- pandas - 如何为每个组生成唯一的 id 和 sub_id
- python-3.x - 使用循环一次创建多个列
- graphql - 使用 graphQL 在突变中发送对象数组
- r - 对齐x轴并在R中的多图图形上添加轴标签