假设,我正在同一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
在这种情况下,我不能使用功能的概念吗?
答案 0 :(得分:0)
必须定义变量purchase_data
才能将其用作函数的参数。由于未定义,因此无法在实际调用函数之前对其进行评估。这会导致错误。
当您说var purchase_data;
时,该变量是已知的,因此可以将其用作参数。但是它仍然没有价值,所以typeof是undefined
。
答案 1 :(得分:0)
收到错误消息是因为purchase_data
和sales_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);