1

编辑:用他自己的话说:https ://twitter.com/fogus/status/393058344413302784

我正在阅读 Michael Fogus 的“Functional JavaScript”,并在第 5 章的开头看到了这个清单:

function dispatch(/* funs */) {
    var funs = _.toArray(arguments);
    var size = funs.length;

    return function(target /*, args */) {
        var ret = undefined; // <----------------------------------- ??
        var args = _.rest(arguments);

        for (var funIndex = 0; funIndex < size; funIndex++) {
            var fun = funs[funIndex];
            ret = fun.apply(fun, construct(target, args));

            if (existy(ret)) return ret;
        }

        return ret;
     };
}

如果这不是一个错误,为什么他明确定义retundefined?这样做的更一般的原因是什么?

提前致谢。

4

3 回答 3

2

这样做可能只是为了让读者更清楚地知道该值尚未定义,或者他明确希望该值是undefined. 也就是说,他将值定义为undefined

但是没有语法上的理由这样做。如果它们位于函数的开头,则执行相同的操作,并且在其他任何地方使用后者很可能会破坏现有变量的值var foo;var foo = undefined;

于 2013-10-23T14:27:06.237 回答
2

对您的问题的简短回答是使事情更加明确。我不能保证作者为什么定义var ret = undefined;,因为我不是作者。但是,我可以解释为什么在教学时明确表达是个好主意。尤其是当你教别人如何编码时。

我最喜欢的文章之一是 Bret Victor 关于可学习编程的著名博客文章(除此之外:你必须阅读它——我坚持认为)。在这篇博文中,布雷特描述了人们如何比抽象概念更好地理解具体示例。因此,通过明确表示,对于没有 JavaScript 经验的人来说,更容易理解程序中发生了什么。

每个自称 JavaScript 程序员的人都必须知道,声明一个变量但不定义它会导致它存在undefined(如果你仔细想想,这很明显)。因此,无论作者是写var ret = undefined;还是简单地写,都没有任何区别var ret;。然而,前者更具体,更容易被新手理解。

但是应该注意的是,这undefined不是 JavaScript 中的保留字。因此,您可以创建一个名为的变量undefined,它可能不是真的undefined。在上面的代码的上下文中,undefined实际上不可能是undefined完全一样的。我们不确定,因为我们看不到dispatch. 然而,很可能它必须是undefined

考虑到上述问题,声明retvar ret = void 0;. JavaScript 中的void运算符接受一个表达式并计算为undefined. 因此void expression总是计算为undefinedvar ret;然而,在给定的上下文中,简单地使用每个理智的 JavaScript 程序员都会做的事情会更容易混淆和模棱两可。

当然,这只是我为作者的决定辩护的解释。要获得更明确的答案,您需要询问作者本人。

于 2013-10-23T14:41:41.617 回答
0

在那种特定情况下,我看不出技术原因,这可能只是他的习惯或习惯。当然,他可以声明ret如下:

var ret;

在那种特定情况下,因为变量是本地的,就足够了。此外,它不会将变量的初始值用于任何东西(在循环中它只是分配它)。

但是,在更复杂的环境中,将变量显式设置为undefined可能是一个好习惯。因为var没有声明块作用域变量,如果你有一个巨大的模块或主体函数——或者你在一个团队中工作,或者你在将不同的脚本发布到网络上之前将它们组合在一起——可能是你重用了同一个变量的名称两次,也许在两个不同的范围内。在这种情况下,如果您没有显式设置该值,您将重用之前设置的值。说清楚:

var ret = 10;
/* doing something with ret */

/* in the same scope, some lines above: */

if (someCondition) {
   var ret;
   console.log(ret); // 10, not `undefined`
}

发生这种情况是因为提升: 变量声明被移到顶部,并且只剩下赋值。因为在if块中没有赋值,并且已经声明了变量,所以那里的声明将被简单地删除。

然后请注意,相同的代码,如果没有var ret = 10开头会导致undefined: 这就是为什么容易出错的原因。

于 2013-10-23T14:30:14.033 回答