条件未定义变量的通用jQuery函数

时间:2018-12-01 18:41:10

标签: javascript jquery

假设,我正在同一JavaScript文件(例如app.js)中进行以下操作:

// triggers in both add and edit mode
var purchase = $('.purchase-selector').doSomething();
// triggers only on edit mode where, purchase_data is available
if( typeof purchase_data !== 'undefined' ) {
    purchase.anotherThing(purchase_data);
}

// triggers in both add and edit mode
var sales = $('.sales-selector').doSomething();
// triggers only on edit mode where, sales_data is available
if( typeof sales_data !== 'undefined' ) {
    sales.anotherThing(sales_data);
}

问题在于,如果没有“购买编辑”模式,则没有purchase_data变量可用。对于sales_data也是一样,它仅在“销售编辑”模式下可用。

代码可以正常工作,但是实际上,我是在违背DRY原则的(我的代码太冗长了)。因此,我尝试了一种简单的方法来删除DRY。

var the_thing = function(selector, edit_data) {
    var thing = selector.doSomething();
    if( typeof edit_data !== 'undefined' ) {
        thing.anotherThing(edit_data);
    }
};

the_thing($('.purchase-selector'), purchase_data);
the_thing($('.sales-selector'), sales_data);

但是问题在于它正在生成Uncaught ReferenceError: purchase_data is not defined(也与sales_data相同)。

所以我尝试了以下方法:

if( typeof purchase_data === 'undefined' ) {
   var purchase_data;
}
the_thing($('.purchase-selector'), purchase_data);

if( typeof sales_data === 'undefined' ) {
   var sales_data;
}
the_thing($('.sales-selector'), sales_data);

但是它也使purchase_data(对象)成为undefined

在编辑模式下:

console.log(typeof purchase_data);

返回:

object

但具有以下代码:

console.log(typeof purchase_data);
if( typeof purchase_data === 'undefined' ) {
   var purchase_data;
}
console.log(typeof purchase_data);

显示:

undefined
undefined

在这种情况下,我不能使用功能的概念吗?

2 个答案:

答案 0 :(得分:0)

必须定义变量purchase_data才能将其用作函数的参数。由于未定义,因此无法在实际调用函数之前对其进行评估。这会导致错误。

当您说var purchase_data;时,该变量是已知的,因此可以将其用作参数。但是它仍然没有价值,所以typeof是undefined

答案 1 :(得分:0)

收到错误消息是因为purchase_datasales_data变量需要先定义才能使用(即使在检查是否已分配值时也是如此)。

您可以做的是,创建一个函数来检查变量是否已被赋值:

function isUndefined(valor) {
    return (typeof valor === 'undefined');
}

然后,在其他代码中,您需要先定义所说的变量,然后才能在任何函数中使用它们:

var purchase_data;
var sales_data;

然后,您可以引用其中未分配任何值的变量,它们的类型为undefined,您可以使用上述函数进行检查:

var the_thing = function(selector, edit_data) {
    var thing = selector.doSomething();

    if(!isUndefined(edit_data)) {
        thing.anotherThing(edit_data);
    }
};

the_thing($('.purchase-selector'), purchase_data);
the_thing($('.sales-selector'), sales_data);