为什么两个相同的语句返回不同的结果,只是用括号括住其中一个而不是另一个

Why two same statements are returning different results with just parentheses wrapping one and not the other one?

本文关键字:一个 另一个 结果 两个 语句 返回 为什么      更新时间:2023-09-26

为什么两个相同的语句返回的结果不同,只是用括号括住其中一个而不是另一个?

function foo(bar){
    return !bar;
}(false) ? false : true; // returns true

(function foo(bar){
    return !bar;
}(false) ? false : true); // returns false! why?!
function foo(bar){
    return !bar;
}
(false) ? false : true

就像在说:

if(false){
   //false
} else {
   //true
}

函数未被调用,条件为false,这意味着它返回第二个语句(具有//true)。


第二种是完全不同的

(function foo(bar){
    return !bar;
}
(false) ? false : true)

是这样的:

function foo(bar){
    return !bar;
}
var temp = foo(false)
if(temp){
    //false
} else {
    //true
}

从技术上讲,您正在创建一个自执行函数立即调用函数表达式(IFFE),其中false是一个参数。它返回的任何内容都受条件约束。所以:

  • 您将false作为参数传递
  • 该函数返回一个反转,即true
  • 对返回进行求值,由于返回是true,它执行条件的第一个语句(具有//false

自执行函数立即调用函数表达式(IFFE)通常具有这些形式,并且通常用于形成闭包(这超出了本问题的范围)

var result = (function(innerParam){
    //function body
}(passedParam));
and
//this form commonly seen in jQuery plugins
var result = (function(innerParam){
    //function body
})(passedParam);

试试这个:

function foo(bar)
{
    alert('fun 1 executed');
    return !bar;
}
(false) ? false : true; // returns true

这个:

(function foo(bar)
{
    alert('fun 2 executed');
    return !bar;
}
(false) ? false : true);

请注意,在情况1中,函数从未被调用。

不适合我。

http://jsfiddle.net/JPv3j/1/

但无论如何,这是一个奇怪的结构,如果它有可能被误解,你可能一开始就不应该使用它。