1

我有一个这样的函数表达式:

var inputChecker = function(field) {
    return function() {
        if(field === '' || field === 'undefined' || field === null) {
            return false;
        }
        return true;
    }
}  

我想在几个不同的函数表达式中使用:

(function($) {
  if(inputChecker(x)) {}
})(jQuery);


(function($) {

})(jQuery);

但问题是 inputChecker 在从它们的主体中声明时在这些函数表达式中不可见?我不明白为什么?inputChecker 不应该是全局的吗?

4

2 回答 2

2

你写的是一个函数工厂。它不返回布尔值,而是一个能够检查属性的函数。

这种功能有时很有用,但是:

  • 你在这里,在返回的函数中,检查工厂收到的属性的值。由于这个值不能改变(它嵌入在闭包中),生成的函数只包含真或假的信息。所以没用。

  • 您正在调用 inputChecker(x) ,就好像它是布尔值而不是函数一样。

所以你可能想要的只是

var checkInput = function(field) {
    if(field === '' || field === 'undefined' || field === null){
        return false;
    }
    return true;
}  

但是如果你真的想生成不同的检查函数,依赖于另一个值,你可以像这样使用函数工厂模式:

var x = true;
var checkInput = (function (x) {
    if (x === true) {
        return function(field) {
            if(field === '' || field === 'undefined' || field === null){
                return false;
            }
            return true;
        }
    } else {
       return function(field) {
           //evaluate field differently
       }
    }
}(x));

现在,取决于是什么x,一个或另一个函数将被分配给checkInput.

于 2013-06-02T19:36:11.193 回答
2

Dystroy 的答案肯定更简单。但如果你想按照自己的方式...

的返回值inputChecker是一个函数,而不是布尔值。如果要调用返回的函数,请使用()表达式:

var fn = inputChecker(x); // gets the function
fn(); // calls the returned function

或更短

inputChecker(x)();

在您的代码中

(function($) {
  if(inputChecker(x)()) {
    // custom code here if x is defined
  }
})(jQuery);

注意:如果要检查变量是否不是undefined,请去掉撇号 - undefined 是常量,而不是字符串

if(field===undefined)
于 2013-06-02T19:42:13.010 回答