2013-06-02 44 views
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应该是全球性的吗?

+2

如果你的函数没有在全局范围内声明,使用'window.inputChecker = ...'。如果是这样,那么我们可能需要更多代码。 –

+3

你为什么要在'inputChecker'中返回一个函数。这很难说,但它看起来并不像你想要的那样。 – basilikum

+0

我想目标是将封闭区域嵌入。这是一个功能工厂。但是,在这里,坦白承认,这似乎很无用...... –

回答

1

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) 
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

相关问题