关于javascript函数声明的问题

时间:2011-06-29 15:52:36

标签: javascript

以下列方式声明javascript函数意味着什么:

JSON.stringify = JSON.stringify || function (obj)
{
  //stuff
};

以上如何区别于下面的声明?

function stringify(obj)
{
  //stuff
}

8 个答案:

答案 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 evaluationJSON.stringify isn't supported by all browsers,如果未定义JSON.stringify,则将其替换为备用函数。

此外,语法可能有点令人困惑。它首先检查JSON.stringify,如果它不存在则创建function(obj) { ... }(即{ ... }中的部分与前面的JSON.stringify无关)。