You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript嵌套函数调用主体及this指向相关技术问询

JavaScript中函数上下文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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:25:55