javascript中这段代码(0,函数)的含义是什么

IT技术 javascript
2021-03-04 14:30:03

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

(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);

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

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

3个回答

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

例如,使用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

@latjobj.method产生一个引用,因此当你调用它时,基数obj被用作this值。但是当您使用逗号运算符时(无论您使用0还是其他都没有关系),引用将被解析为一个值。
2021-04-21 14:30:03
……你只是给了我一堆其他理由来声称 JavaScript 设计被破坏了……
2021-04-22 14:30:03
@Whelkaholismobj.method.call(undefined)如果您希望它在严格模式下也等效,则应该如此。但这需要callFunction.prototype. 并非所有可调用对象都继承自Function.prototype,即使它们继承call也可能被隐藏。
2021-04-22 14:30:03
做第二个例子的更好、更易读的方法不是obj.method.call(window)吗?
2021-04-25 14:30:03
谁能解释为什么这有效?javascript 似乎用另一个函数包装了一个函数引用,该函数的第一个参数是范围或上下文?您可以使用什么来替换使上述表达式再次成立的 0?
2021-05-04 14:30:03

典型的例子可能是,

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

逗号运算符将从左到右计算表达式并返回最右边表达式的结果

// e.g.

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

我认为这var a = 1, b = 2, c = 3不是“逗号运算符”,而是 var 声明。a, b, 和chere 是在本地范围内创建的,因此它们实际上都用var. 为了说明,这里有 2 个函数:function foo(){var a = 1, b = 2, c = 3;} function bar(){var a = (1, b = 2, c = 3);}. 如果您运行foo();, a, b, 和c将仅存在于本地范围内。但是,如果您运行bar();,您会在全局范围内找到bc这是因为该(1, b = 2, c = 3)部分现在是您的“逗号运算符”。
2021-05-02 14:30:03
这是来源:i-programmer.info/programming/javascript/...在“这不是您正在寻找的逗号”部分下
2021-05-20 14:30:03

它是一个包含自执行匿名函数逗号运算符但是,除了混淆目的之外,我不知道为什么包含无意义的内容0