函数在函数表达式中不可见,如何解决这个问题?

时间:2013-06-02 19:15:06

标签: javascript function expression visibility

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

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不是全球性的吗?

2 个答案:

答案 0 :(得分:2)

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

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

  • 你在这里,在返回的函数中,检查工厂收到的属性的值。由于此值不能更改(它嵌入在闭包中),因此生成的函数不会保留更多信息,而不仅仅是true或false。所以这没用。

  • 你正在调用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

答案 1 :(得分: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)