关于自我执行功能的怪异事情

时间:2018-09-20 12:41:38

标签: javascript

我偶然发现了验证库中的某项内容,其中他们将required-validation用作验证功能的一部分。

现在,我似乎找不到或无法理解的怪异与自我执行功能有关。这是来自代码。

value => !(0,req)(value) || [...some more checks]

现在.. req()方法接受一个参数,到目前为止我们还不错。让我感兴趣的是,我们也可以写req(value)(req)(value)。.但是前面的零似乎完全没用。

我在这里使用alert()尝试了很多东西,得出了一个奇怪的结论。我运行了这些案例检查器控制台以测试输出。  效果与以下效果一样好:

(alert)('hello')»发出“你好”警报

(0,alert)('hello')»发出“你好”警报

(0,1,3,5,1,alert)('hello')»发出“你好”警报

(console.log,alert)('hello')»发出“你好”警报

(alert,1)('hello')»给出错误(alert,1) is not a function

(alert,console.log)('hello')»提供控制台日志“你好

(alert,1,"test",console.log)('hello')»提供控制台日志“你好


有人可以向我解释此决议的工作方式吗?

为什么它似乎提供了最新的方法,因此(0,alert)(alert)(0, console.log, "test", alert)一样?

2 个答案:

答案 0 :(得分:1)

因为它要从方括号中获取最后一个值并执行代码:

    a = [1, 2, 3]
    b = [4, 5, 6]
    console.log((a,b)[0]) //prints 4
    //because Its JavaScript's default behaviour
    x = function(){alert("foo")};
    y = function(){alert("bar")};
    (x,y)() // alerts bar
    //because it takes last function which is y
    //also  for simple variable
    p = 10;
    q = 20;
    console.log((p,q)); //prints 20

答案 1 :(得分:0)

这里没有关于方法/功能的任何具体说明。您只是看到Comma operator在起作用。

  

逗号运算符计算每个操作数(从左到右)并返回最后一个操作数的值。

例如,(alert,1,"test",console.log)的求值为console.log,然后('hello')之后只是对该函数的调用。

这令人困惑,因为此代码中的括号用于两个单独的内容:围绕表达式或调用函数。如果跟随函数,则仅表示“调用函数”。否则,逗号运算符将起作用。

(请注意,缩小符可以使用逗号运算符来缩减代码,但请不要在实际代码中使用,因为它太深奥了。)