关于JavaScript函数声明的问题

5

当 JavaScript 函数以以下方式声明时,它是什么意思:

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

上述方式与仅如下声明有何不同?

function stringify(obj)
{
  //stuff
}

第一个代码块不是函数声明,只有第二个块是... - Šime Vidas
第一个代码块是什么? - Abe Miessler
@Abe 在你上面的问题中,这个灰色块。你的问题中有两个代码块。第一个代码块没有包含函数声明。 - Šime Vidas
我理解你的意思。我的问题是,“如果代码块1不是函数声明,那它是什么?” - Abe Miessler
1
@Abe Miessler,这是一个属性定义。var a = function() { ... } 定义了一个名为a的变量,其值为匿名函数。JSON.stringify = function() { ... } 也是如此。 - rid
@Abe 这是一个赋值操作。你正在为 JSON.stringify 属性分配一个值。右侧的函数是一个函数表达式。 - Šime Vidas
8个回答

7
  • 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 */
    

3
翻译:不是全局范围,而是包含范围。包含范围不一定是全局范围。 - Šime Vidas

2

第一个声明不会覆盖已经存在的函数,而第二个声明会覆盖!


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

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

1

|| 是一个逻辑运算符,它总是返回第一个为 true 的东西。如果 JSON.stringify 未定义(或其他 falsy 值),那么 JSON.stringify 包含在 || 之后编写的函数。

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

回答您的问题,在第一个例子中,您的函数可以通过 JSON.stringify() 调用,在第二个例子中则可通过 stringify() 调用。


0

第一种方法将在函数已经存在的情况下声明该函数。

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

这意味着如果存在JSON.stringify,它将使用该函数,否则它将创建一个新的函数。

0
如果函数stringify已经被定义过,它将不会被重复定义。

0

它利用了短路求值并非所有浏览器都支持JSON.stringify, 因此在JSON.stringify未定义的情况下,它将其替换为备份函数。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接