(0, function)(param)结构
在读一些源码的时候,发现许多函数在调用时,都采用了 (0, function)(param)
的形式调用,这种结构的作用和原理是什么?下面我们就说一下(0, function)(param)结构。
先看下面这道题:
<script>
const obj = {
test (a) {
console.log('args: ', a);
console.log('this: ', this);
}
};
(0, obj.test)(1);
obj.test(1)
</script>
一、作用
(0, function)(param)
这种写法的作用是强制改变 this 的指向,会将 this 指向全局对象,也就是 window 或者 global。不光是 0 ,你传随意值,0可能是为了理解和方便。
为什么源码要用这种 (0, function)(param)
方式去绑定 this,而不是 function.call()/apply()
的形式呢?
那是因为源码中有时会修改 prototype
,将 call/apply
指向成自己的函数,甚至改变prototype
的指向,这样就会导致原型链上方法不可用,就可以用(0, function)(param )
来实现了
二、原理
其本质是 js
的 逗号操作符
在 JavaScript 中,逗号操作符 ,
用于分隔多个表达式,并返回最后一个表达式的值。例如:
let a = (1, 2, 3);
console.log(a); // 输出 3
需要注意的是,(0, function)(param)结构里function
在这里应该是一个有效的函数引用。如果 function
没有被定义为一个函数,或者它不是一个可调用的对象,那么这段代码将会抛出错误。