当 JavaScript 函数以以下方式声明时,它是什么意思:
JSON.stringify = JSON.stringify || function (obj)
{
//stuff
};
上述方式与仅如下声明有何不同?
function stringify(obj)
{
//stuff
}
当 JavaScript 函数以以下方式声明时,它是什么意思:
JSON.stringify = JSON.stringify || function (obj)
{
//stuff
};
上述方式与仅如下声明有何不同?
function stringify(obj)
{
//stuff
}
function stringify
will declare the function in the global scope (if you're not already inside another scope, such as another function or a hash) or the scope you're currently in.
Example:
function a() { ... } /* global scope */
function a() { function b() { ... } /* scope of the a() function */ }
JSON.stringify = function
will define the function on the JSON
object.
Example:
JSON = {}
JSON.stringify = function() { ... } /* you can now call stringify() on the JSON object */
JSON.stringify || function
will only define it if it was not previously defined.
Example:
JSON = {}
JSON.stringify = function() { ... }
JSON.stringify = JSON.stringify || function() { ... } /* will not be replaced */
第一个声明不会覆盖已经存在的函数,而第二个声明会覆盖!
第一个代码块等同于这个:
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
}
window.event
值(这是IE存储相应事件的位置)。e = e || window.event;
这相当于:
if ( e ) {
e = e; // no-op
} else {
e = window.event;
}
||
是一个逻辑运算符,它总是返回第一个为 true 的东西。如果 JSON.stringify 未定义(或其他 falsy 值),那么 JSON.stringify 包含在 ||
之后编写的函数。
换句话说,它检查 JSON.stringify 是否已经存在,如果不存在,则将第二个函数分配给它。
回答您的问题,在第一个例子中,您的函数可以通过 JSON.stringify()
调用,在第二个例子中则可通过 stringify()
调用。
第一种方法将在函数已经存在的情况下声明该函数。
JSON.stringify = JSON.stringify || function (obj){
}
JSON.stringify
,它将使用该函数,否则它将创建一个新的函数。它利用了短路求值。并非所有浏览器都支持JSON.stringify
, 因此在JSON.stringify
未定义的情况下,它将其替换为备份函数。
此外,语法可能有点令人困惑。它首先检查JSON.stringify
是否存在,如果不存在,则创建function(obj) { ... }
(即,{ ... }
部分与前面的JSON.stringify
无关)。
var a = function() { ... }
定义了一个名为a的变量,其值为匿名函数。JSON.stringify = function() { ... }
也是如此。 - ridJSON.stringify
属性分配一个值。右侧的函数是一个函数表达式。 - Šime Vidas