在javascript [duplicate]中(0,someFunction)()的含义是什么

6tdlim6h  于 2022-12-10  发布在  Java
关注(0)|答案(3)|浏览(126)

此问题在此处已有答案

(1, eval)('this') vs eval('this') in JavaScript?(4个答案)
六年前就关门了。
截至12小时前,机构群体正在审查是否重新讨论此问题。
我在某人代码中发现了这段代码,它听起来像这样:

(0, function (arg) { ... })(this)

在我试着像下面这样到处玩之后,

(0, function (arg) { console.log(arg) })(2);
console.log((0, 1, 2, 3));
(0, function plus1 (arg) { console.log(arg + 1) }, function plus2 (arg) { console.log(arg + 2) })(5);

我发现它总是返回括号中的最后一项。
我想知道这个编程模式的名字是什么,用例是什么?

r3i60tvu

r3i60tvu1#

在这种特殊情况下,它似乎是多余的,但有时这种方法是有用的。
例如,对于eval

(function() {
  (0,eval)("var foo = 123"); // indirect call to eval, creates global variable
})();
console.log(foo);            // 123
(function() {
  eval("var bar = 123");     // direct call to eval, creates local variable
})();
console.log(bar);            // ReferenceError

当您想要呼叫方法,而不将对象当做this值传递时,这个方法也很有用:

var obj = {
  method: function() { return this; }
};
console.log(obj.method() === obj);     // true
console.log((0,obj.method)() === obj); // false

另请注意,根据上下文,它可能是参数分隔符而不是逗号运算符:

console.log(
  function(a, b) {
    return function() { return a; };
  }
  (0, function (arg) { /* ... */ })(this)
); // 0

在此方案中,(0, function (arg) { /* ... */ })是函数的参数(a=0, b=function (arg) { /* ... */ }

function(a, b) {
  return function() { return a; };
}

而不是逗号运算符。(然后,最后的(this)是对返回函数function() { return a; }的带参数this的函数调用。但这部分与逗号运算符/参数分隔符的区别无关)

vbopmzt1

vbopmzt12#

它是一个用self-executing anonymous function Package 的comma operator。但是,我不知道为什么除了obfuscation的目的之外,没有意义的0被包括在内。

jyztefdp

jyztefdp3#

典型例子可以是,

for(var i=0,j=10; i < j; i++){
 // code ...
}

comma operator将从左向右计算表达式,并返回最右侧表达式的结果

// e.g.

var a = 1, b= 2, c = 3, d = function(){ console.log("a => " +  a) }()

相关问题