奇怪的JavaScript代码

时间:2015-01-25 13:07:53

标签: javascript idioms

我找到了这段代码:

;       
100% function($) {                                        // WTF?
    var _true_ = true;                                    // WTF?
    var _false_ = false;                                  // WTF?
    var go = function(location, date) {
        location || (location = {});  
        var result = _false_;
        if (date && date.day) {       
            result = geoService.go(location, date);
        }
        return !!result;              
    }
    var process = function(func) {
        var args = [].prototype.slice.call(arguments, 1); 
        return function() {                               
            return func.apply(this, args);
        }
    }
    // ...
}(jQuery, undefined);                                     

在这里:http://www.dofactory.com/products/javascript-jquery-design-pattern-framework (对不起,页面上没有找到id-s)

我不明白这些部分在做什么:

  1. " 100%"在第二行
  2. 3-4行中的var _true_ = true;var _false_ = false;作业
  3. 我很好奇,这些目的是什么。

2 个答案:

答案 0 :(得分:9)

  

第二行的“100%”

数字100后跟模数运算符。除了强制右侧被视为函数表达式而不是函数声明之外,它不用于任何东西(因为结果未被捕获)。

这是一种我从未见过的非常罕见且不直观的方法。

更常见的是将函数表达式包装在parens中或在其前面加上not运算符。

  

var true = true;和var false = false;分配3-4行

作者似乎试图通过将truefalse复制到名称中包含非字母数字字符的变量而不是始终使用文字来引起对{{1}}和{{1}}的使用的注意。再次,这是非常奇怪的,而不是我以前见过的东西。

答案 1 :(得分:6)

看起来它是一个错误使用的“最佳实践”的集合,它不会导致异常,但绝对奇怪和模糊。看看第二行和最后一行。最佳实践反之亦然:

(function ($, undefined){
    // do the stuff 
})(jQuery);

undefined here将是真正的undefined,因为当函数调用时没有第二个参数。但是地球上的什么原因可能是将“未定义”参数传递给函数并且不使用它的原因?这看起来像个恶作剧。

同样的事情在5行:它看起来(并且实际上是行动)作为“默认参数”分配但以奇怪的方式完成(传统上,更明显地用作location = location || {};)。我相信只有这样做才能写出来的理由可能是混淆,开玩笑或误解。

同样的事情是100%。您可以使用任何运算符来指示函数表达式。最常见的方法是使用括号。但通常你也可以见面:

!function(){

}();

或:

+function(){

}();

但你也可以写

42 * function(){

}();

所有行为都是一样的,只有括号最明显和最常见。