JavaScript中this绑定疑问:取决于调用位置还是调用方式?
关于
this绑定:调用方式 vs 调用位置的疑惑解答 嘿,我当初重读《You Don't Know JS: this & Object Prototypes》的时候也注意到这两处表述,一开始也以为是不是作者前后矛盾,但仔细琢磨后发现,这俩其实是从不同角度解释同一个核心逻辑,完全不冲突~
先拆解这两句话:
第一句:“this绑定与函数声明的位置无关,完全取决于函数的调用方式”
这里的“调用方式”其实已经包含了调用位置的上下文。比如:
- 当你直接调用函数(
foo()),这是一种调用方式,对应的调用位置在全局/当前作用域,this绑定到全局对象(非严格模式)或undefined(严格模式); - 当你把函数作为对象方法调用(
obj.foo()),这是另一种调用方式,调用位置处于obj的上下文,this就绑定到obj; - 用
new关键字调用(new foo())、或者用call/apply/bind指定上下文,这些都是不同的调用方式,而每种方式对应的调用位置场景直接决定了this的指向。
所以这句话的核心是:不要看函数写在哪儿,要看它是怎么被调用的——这是判断this指向的核心原则。
第二句:“this实际上是函数在……时创建的绑定”
书里省略的应该是“被调用”,完整表述是“this实际上是函数在被调用时创建的绑定”。这句话强调的是绑定的时机:this并不是在函数声明的时候就确定的,而是在函数真正被执行(调用)的那一刻,才会根据当时的调用场景(也就是刚才说的调用方式/位置)创建这个绑定。
举个例子就明白:
function foo() { console.log(this); } const obj1 = { foo: foo }; const obj2 = { foo: foo }; foo(); // 全局对象/undefined(取决于严格模式) obj1.foo(); // this是obj1 obj2.foo(); // this是obj2
同一个函数foo,声明位置没变,但每次调用的方式/位置不同,this的绑定就不一样——这正好同时印证了两句话:绑定和声明位置无关(取决于调用方式),且绑定是在调用时创建的。
总结一下:这两个表述是互补的,前者告诉你判断this的依据是什么(调用方式/位置),后者告诉你这个绑定什么时候产生(调用时刻),本质上是一回事~
内容的提问来源于stack exchange,提问作者firefiber
相关产品推荐
相关产品推荐

