我知道编写这样的代码是不好的做法:
var createBox = function(width, height, margin){
alert("Margin is set to " + margin);
//margin is undefined in this context or why?
var margin = margin || 2;
alert("Margin is now " + margin);
}
createBox(0,0,0);
但有人可以解释一下,为什么保证金总是设为2?
是否因为在函数内部初始化具有相同名称的变量的直接上下文中未定义它?
编辑:对不起,我的问题出错......请给一个小提示:) 此致,汤姆
答案 0 :(得分:3)
如果第一个操作数是真实的,则JavaScript中的||
运算符返回第一个操作数的值。否则返回第二个操作数的值。与其他一些语言一样,它不会返回1
/ 0
或true
/ false
。
因此,当margin
参数包含假值(例如0
或undefined
)时,它将返回2
,因为这些都是JavaScript中的虚假值。< / p>
JavaScript中的虚假值包括:空字符串""
,null
值,值0
,NaN
值,布尔值{{1 }},还有false
。
你所描述的是JavaScript中非常常见的习语。事实上,undefined
运算符有时被称为默认运算符 1 。您可以使用它为变量||
分配默认值。这种情况下的问题是,由于undefined
是有效参数,因此默认运算符的行为不符合要求。您可能希望执行以下操作:
0
1 Douglas Crockford: The Elements of JavaScript Style - Part 2 - Idioms.
答案 1 :(得分:3)
如果调用createBox(0,0,0),则margin为0(其真值为false
),因此表达式margin || 2
变为0 || 2
到2。
答案 2 :(得分:2)
0评估为false List of Truthy Values
答案 3 :(得分:1)
// This function creates a new box by receiving three parameters
var createBox = function(width, height, margin){
// Output the margin of the box, zero in current case
alert("Margin is set to " + margin);
// If the margin is zero or undefined, '' set default value to 2
var margin = margin || 2;
// Output the new value of the margin which is 2
alert("Margin is now " + margin);
}
// here will show Margin: 0 after that Margin: 2
createBox(0,0,0);
// here will show Margin: 1 after that Margin: 1
createBox(0,0,1);
// here will show Margin: 3 after that Margin: 3
createBox(1,2,3);