JavaScript嵌套函数调用主体及this指向相关技术问询
this的常见疑问解答 先看示例代码:
function outer(){ function inner(){ } }
问题与解答
问题1:函数是否因属于某个特定对象而决定其上下文
this?
不是。函数的this指向完全由调用方式决定,和它属于哪个对象没有直接绑定关系。哪怕函数是某个对象的属性,只要调用方式改变,this指向也会跟着变。问题2:例如,outer函数是window对象的成员,这是否是其上下文
this指向window对象的原因?
本质上是因为你以全局普通调用的方式执行outer(),这种调用逻辑下this默认指向全局对象(浏览器环境中就是window)。如果把outer赋值给其他对象并通过该对象调用(比如const obj = {outer}; obj.outer()),this就会指向obj,和它原本属于window无关。问题3:若是如此,inner函数属于哪个对象?
在当前代码中,inner只是outer内部的局部函数,它默认不属于任何对象(除非你主动将它挂载到某个对象上)。它的作用域被限定在outer内部,只有当outer执行时才会被定义。问题4:inner函数是否属于outer函数的对象?
不属于。函数本身是对象,但inner只是outer执行时创建的局部变量,并没有成为outer这个函数对象的属性。除非你手动添加outer.inner = inner这样的代码,否则两者只是作用域嵌套关系,而非属性归属关系。问题5:为什么inner函数的上下文
this指向window对象?
假设你是在outer内部以普通方式调用inner(),这种调用属于普通函数调用,非严格模式下这种调用的this默认指向全局对象(浏览器中为window)。this的指向和函数定义的位置无关,只看调用时的形式。问题6:所有未使用new运算符调用的函数(全局或嵌套),其上下文
this都会指向window对象吗?
不一定,存在例外情况:- 严格模式下(代码开头添加
"use strict"),普通函数调用的this会是undefined,而非window; - 使用
call/apply/bind显式指定上下文时,this会指向你传入的对象; - 作为对象方法调用时(比如
obj.inner(),前提是inner被挂载到obj上),this会指向该对象,和函数原本的定义位置无关。
- 严格模式下(代码开头添加
内容的提问来源于stack exchange,提问作者Prajval Gahine

