暧昧的电话? javascript函数和对象

时间:2011-03-30 08:09:32

标签: javascript ambiguous-call

我在jQuery中看到了具体的

var a= 'something' || function () {

}

var a = 'something' || { }

这是什么意思?我知道{}是javascript中的对象json,我知道javascript中的匿名函数,但仍然无法弄清楚这意味着什么。

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

你很可能包含一个错误的例子。您的代码 有效,但编写起来没用,因为您要为变量分配一个已知字符串,这会使以下OR语句无效。

常见的是这样的语法:

function foo(bar) {
   // set baz to the contents of bar
   // or create an empty object if bar evaluates to false
    var baz = bar || {}; 
}

答案 1 :(得分:1)

这种“条件赋值”是语言中常见的习语,利用布尔运算符的短路(在本例中为“OR”)来为变量赋值左侧表达式的值(如果它)如果不是,则评估为“真实”值或右侧表达式。考虑:

var nullOrFive = null || 5; // => 5

左侧(null || five)评估从左到右测试OR操作符的每个操作数,直到找到“真实”操作符,然后返回它。另一方面:

var tenOrWhatever = 10 || someMethodThatIsNeverCalled(); // => 10

所以在你的例子中,如果“something”的计算结果为true(除了“undefined”,“null”和JavaScript中为零),那么变量“a”将获得其值,否则它将获得该函数(function() {...})或对象文字({})。

答案 2 :(得分:1)

在为变量赋值时,JavaScript正在评估给定的表达式。

var s= s || {};

这意味着如果当前作用域中已存在名为s的变量,则新创建的s变量指向它。否则,如果s变量未在当前范围中定义,或者它指向空引用,或者指向其他值为FALSE的值,则新创建的s变量将指向新对象。当一个人在多个文件中扩展一个对象时,这很有用:

<强> File1中

var globalNamespace = globalNamespace  || {};
globalNamespace.someVariable  = "some value;"

<强>文件2

var globalNamespace = globalNamespace  || {};
globalNamespace.someFunction = function()
{
    return this.someVariable;
};

通过这种方式,可以扩展globalNamespace对象,而不必担心代码被分散在多个文件中。

答案 3 :(得分:0)

在MDC上引用documentation

Logical OR (||)
expr1 || expr2
Returns expr1 if it can be converted to true; otherwise, returns expr2.
Thus, when used with Boolean values, || returns true if either operand is true;
if both are false, returns false.

另外,还有一个短路评估:     由于逻辑表达式从左到右进行评估,因此使用以下规则对它们进行可能的“短路”评估测试

因此,如果expr1可以被评估为true,则不评估expr2。

jQuery使用大量的短路评估来定义变量的默认值。例如。     var o = options || {};     将选项放在变量o中;但如果选项未定义或为空,将确保o初始化为{}