以下列方式声明javascript函数意味着什么:
JSON.stringify = JSON.stringify || function (obj)
{
//stuff
};
以上如何区别于下面的声明?
function stringify(obj)
{
//stuff
}
答案 0 :(得分:7)
function stringify
将在全局范围内声明该函数(如果您尚未在另一个范围内,例如另一个函数或哈希)或您当前所在的范围。
示例:
function a() { ... } /* global scope */
function a() { function b() { ... } /* scope of the a() function */ }
JSON.stringify = function
将在JSON
对象上定义函数。
示例:
JSON = {}
JSON.stringify = function() { ... } /* you can now call stringify() on the JSON object */
JSON.stringify || function
只会在之前未定义的情况下定义它。
示例:
JSON = {}
JSON.stringify = function() { ... }
JSON.stringify = JSON.stringify || function() { ... } /* will not be replaced */
答案 1 :(得分:2)
如果第一个声明已存在,则第一个声明不会覆盖该函数,第二个声明会执行!
答案 2 :(得分:1)
上面的代码检查JSON.stringify函数是否已经定义,如果没有使用新定义则只使用它。
答案 3 :(得分:1)
||
是一个逻辑运算符,它总是返回第一个真实的东西。如果JSON.stringify未定义(或其他一些假值),则JSON.stringify包含在||
之后编写的函数。
换句话说,它检查JSON.stringify是否已经存在,如果不存在,它会为其分配第二个函数。
要在第一个示例中回答您的问题,您的功能可以通过JSON.stringify()
stringify()
来调用
答案 4 :(得分:1)
第一个代码块等同于:
if ( !JSON.stringify ) {
JSON.stringify = function(obj) {
// stuff
};
}
说明:如果JSON.stringify
属性强制转换为false
,请设置此属性并为其分配函数对象。
背景是:有些浏览器实现了JSON.stringify
功能,有些浏览器没有实现(例如旧版本的IE)。您想要的是在这些浏览器中手动实现此功能。因此,您测试JSON.stringify
是否返回函数对象。它确实如此,你很好;如果没有,则手动设置此属性。
另一个例子:
function handler(e) {
e = e || window.event;
// handle event
}
现代浏览器将事件对象传递给事件处理程序;但IE的旧版本不这样做。因此,您需要测试传入的参数是否为对象(是否已定义?),如果不是(检测到IE!),请使用window.event
值(IE存储相应事件的位置)
这行代码可以做到:
e = e || window.event;
相当于:
if ( e ) {
e = e; // no-op
} else {
e = window.event;
}
答案 5 :(得分:0)
如果已经定义了函数stringify,则不会定义多次。
答案 6 :(得分:0)
如果函数已经存在,第一种方法将声明该函数。
JSON.stringify = JSON.stringify || function (obj){
}
这意味着JSON.stringify
存在,它将使用它,否则它将创建一个新函数。
答案 7 :(得分:0)
它利用short-circuit evaluation。 JSON.stringify
isn't supported by all browsers,如果未定义JSON.stringify
,则将其替换为备用函数。
此外,语法可能有点令人困惑。它首先检查JSON.stringify
,如果它不存在则创建function(obj) { ... }
(即{ ... }
中的部分与前面的JSON.stringify
无关)。