为什么两个相同的语句返回不同的结果,只是用括号括住其中一个而不是另一个
Why two same statements are returning different results with just parentheses wrapping one and not the other one?
为什么两个相同的语句返回的结果不同,只是用括号括住其中一个而不是另一个?
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/
但无论如何,这是一个奇怪的结构,如果它有可能被误解,你可能一开始就不应该使用它。
相关文章:
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 使用clickToggle并在单击另一个元素时关闭元素
- 使用javascript将动态表从一个html页面打印到另一个html页
- 如何在android中使用phonegap将文件从一个文件夹移动/复制到另一个文件夹
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 从Rally获取一个特定的标记,以便计算另一个字段中的值
- 无法从jquery Mobile导航栏重定向到另一个页面
- 如何在JQuery函数中定义一个值,然后调用另一个函数并使用该值
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 字符串在将其传递给另一个活动Android JavaScript时读取Null
- 如何在鼠标悬停时在另一个图像上滑动图像.
- 导航到特定事件的另一个变量页面
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- 如何在react js中将值从一个组件发送到另一个组件
- 按我自己的类克隆另一个元素的内容和顺序
- 在另一个函数中使用变量this
- 如何在react js中从一个页面导航到另一个页面
- 在另一个函数成功结束后调用该函数
- 要求定义另一个文件中的对象