1.&& 和 || 表达式
在函数中给变量设置默认值时:
function test(val){
if(!val){
val = "default value";
}
}
上面代码可以这样简化
function test(val){
val = val || "default value";
}
|| 表达式从左到右依次判断,若左边为真,则返回左边表达式的值,并不往后执行;若左边表达式为假,则继续判断右边表达式,并返回右边表达式的值。
还有如下的 if 判断
if(age && age > 18){
return true;
}else {
return false;
}
可以写成
return age && age > 18;
&& 表达式从左到右依次判断,若左边表达式为假,则直接返回左边表达式的值,并不往后执行;若左边表达式为真,则继续判断右边表达式,并返回右边表达式的值。
看下面这个例子
function checkLogin(userName){
if(userName){
logIn(userName);
}else {
signUp();
}
}
可以改写为
function checkLogin(userName){
userName && logIn(userName) || signUp();
}
如果 userName 为真,则调用logIn 函数,并传递 userName 参数;如果 userName 为假或者 logIn 函数返回值为假,则调用 signUp 函数.
在看这个例子
var user = {id:'user id',log: 'user log'}, userId;
if(user && user.log){
userId = user.id;
} else {
userId = null;
}
可以改写为
var user = {id:'user id',log: 'user log'}, userId;
userId = user && user.log && user.id;
如果 user 为真,则调用 user.log ,并判断 user.log 的真假,若 user.log 为真,则返回以三个表达式的值。
如果 user 为空,则返回 null.
2.立即调用函数表达式
(function(){
// do ...
})();
他相当于
? = function(){};
(? = function () {} );
函数被一个不知名的变量引用了,并用一对括号包含,就将其变为一个匿名的函数表达式。
同样的我们可以创建一个命名的立即调用的函数,
(show = function(txt){
alert(txt || "aaa");
})();
show('bbb'); // bbb
show(); // aaa
当你不用var关键词创建变量的时候, JavaScript会自动判断该变量为全局变量. 在上面的例子中是没有必要使用var关键词的(因为你之后可能会调用它).
我们可以马上或者在这之后使用这个函数
但是我们不可以在之后调用匿名函数. 因为除非你创建匿名函数之后马上调用, 在这之后没有其他办法可以引用它. 这是匿名函数只可以马上调用它的原因.
当把匿名函数包含在一对括号里面时(字面量), 整个字面量会被运算,并且返回匿名函数的返回值. 它的返回值实质上是整个匿名函数自身, 所以我们只需要在这之后加上一对括号来马上调用它.
因此, 后面的一对括号等于告诉JavaScript编译器马上调用这个匿名函数, 所以它才会被称之为”立即调用函数表达式”.
因为JavaScript基于函数块的作用域规则, 在匿名函数内声明变量都是局部变量, 所以这些局部变量没办法直接从外部获取.
就像其他函数一样, 你可以向匿名函数设定参数和传递变量. 你可以根据这个特性, 利用匿名函数的作用域扩展它外围函数的作用域(即闭包).