关于javascript函数声明的问题

问题描述 投票:0回答:8

当 JavaScript 函数以如下方式声明时,这意味着什么:

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

上面的内容与下面这样声明有何不同?

function stringify(obj)
{
  //stuff
}
javascript operators
8个回答
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 */
    

2
投票

如果函数已经存在,第一个声明不会覆盖该函数,第二个声明会覆盖该函数!


1
投票

上面的代码检查 JSON.stringify 函数是否已经定义,如果是,则使用它,如果不使用新定义。


1
投票

||
是一个逻辑运算符,它总是返回第一个正确的结果。如果 JSON.stringify 未定义(或其他一些虚假值),则 JSON.stringify 包含在
||
之后编写的函数。

换句话说,它检查 JSON.stringify 是否已存在,如果不存在,则将第二个函数分配给它。

要回答您在第一个示例中的问题,您的函数可以通过

JSON.stringify()
在第二个示例中通过
stringify()

进行调用

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;
}

0
投票

如果函数 stringify 已经被定义,则不会被定义多次。


0
投票

第一种方法将声明该函数(如果该函数已经存在)。

JSON.stringify = JSON.stringify || function (obj){
}

这意味着

JSON.stringify
存在,它将使用它,否则它将创建一个新函数。


0
投票

它利用短路评估

JSON.stringify
并非所有浏览器都支持,因此在未定义
JSON.stringify
的情况下,将其替换为备份功能。

此外,语法可能有点混乱。它首先检查

JSON.stringify
,如果不存在则创建
function(obj) { ... }
(也就是说,
{ ... }
中的部分与前面的
JSON.stringify
无关)。

© www.soinside.com 2019 - 2024. All rights reserved.