我有一个像这样的函数表达式:
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不是全球性的吗?
答案 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)