当 JavaScript 函数以如下方式声明时,这意味着什么:
JSON.stringify = JSON.stringify || function (obj)
{
//stuff
};
上面的内容与下面这样声明有何不同?
function stringify(obj)
{
//stuff
}
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 */
如果函数已经存在,第一个声明不会覆盖该函数,第二个声明会覆盖该函数!
上面的代码检查 JSON.stringify 函数是否已经定义,如果是,则使用它,如果不使用新定义。
||
是一个逻辑运算符,它总是返回第一个正确的结果。如果 JSON.stringify 未定义(或其他一些虚假值),则 JSON.stringify 包含在 ||
之后编写的函数。
换句话说,它检查 JSON.stringify 是否已存在,如果不存在,则将第二个函数分配给它。
要回答您在第一个示例中的问题,您的函数可以通过
JSON.stringify()
在第二个示例中通过 stringify()
进行调用
第一个代码块相当于:
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;
}
如果函数 stringify 已经被定义,则不会被定义多次。
第一种方法将声明该函数(如果该函数已经存在)。
JSON.stringify = JSON.stringify || function (obj){
}
这意味着
JSON.stringify
存在,它将使用它,否则它将创建一个新函数。
它利用短路评估。
JSON.stringify
并非所有浏览器都支持,因此在未定义 JSON.stringify
的情况下,将其替换为备份功能。
此外,语法可能有点混乱。它首先检查
JSON.stringify
,如果不存在则创建function(obj) { ... }
(也就是说,{ ... }
中的部分与前面的JSON.stringify
无关)。