这个代码(0,函数)在javascript中是什么意思

Sim*_*mon 35 javascript

我在某人的代码中发现了这段代码,听起来像这样:

(0, function (arg) { ... })(this)
Run Code Online (Sandbox Code Playgroud)

在我尝试如下玩之后,

(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);
Run Code Online (Sandbox Code Playgroud)

我发现它总会返回括号中的最后一项.

我想知道这个编程模式的名称是什么,用例是什么?

Ori*_*iol 34

在这种特殊情况下,它似乎是多余的,但有时这种方法很有用.

例如,用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
Run Code Online (Sandbox Code Playgroud)

当您想要在不将对象作为this值传递的情况下调用方法时,它也很有用:

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

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

console.log(
  function(a, b) {
    return function() { return a; };
  }
  (0, function (arg) { /* ... */ })(this)
); // 0
Run Code Online (Sandbox Code Playgroud)

  • ...你刚刚给我一些其他理由声称JavaScript设计已经破解...... (11认同)
  • @Whelkaholism 如果你希望它在严格模式下也等效,那么它应该是 `obj.method.call(undefined)` 。但这需要函数从“Function.prototype”继承“call”。并非所有可调用对象都继承自“Function.prototype”,即使它们继承,“call”也可能会被隐藏。 (3认同)
  • 谁能解释为什么这有效?看来javascript用另一个函数包装了一个函数引用,它的第一个参数是范围或上下文?您可以使用什么来替换使上述表达式再次成立的 0? (2认同)
  • @latj `obj.method` 生成一个引用,因此当您调用它时,基础 `obj` 被用作 `this` 值。但是当您使用逗号运算符时(无论您使用“0”还是其他),引用都会解析为一个值。 (2认同)