我有这个代码:
var phrase = function (variable, defaultPhrase) {
if (typeof variable === "undefined") {
return defaultPhrase;
}
else {
return variable;
}
}
它的名字是这样的:
Ext.Msg.show({title: phrase(js_shutdown,'Shutdown'), //...
我想做的是在没有定义变量时使用默认短语,但当我将未定义的变量传递给phrase()
时,JS会抛出一个未定义变量错误。我该如何解决这个问题?还有其他想法吗?
您不需要函数。通常使用||
运算符:
Ext.Msg.show({ title: js_shutdown || 'Shutdown', //...
您可以将||
看作:
someValue || defaultValue
对于字符串,如果someValue === ""
,则使用defaultValue
。
如果根本没有定义变量,则需要内联typeof x === "undefined"
检查,因为不能将变量传递给函数(即ReferenceError
)。
通常使用||
就足够了,就像其他人建议的那样。但是,如果您希望0、false和null作为可接受的值,那么您确实需要检查变量的类型是否未定义。您可以使用三元运算符使其成为一行:
var variable;
var defaultPhrase = "Default";
var phrase = (typeof variable === "undefined" ? defaultPhrase : variable);
console.log(phrase);
// => "Default"
在javascript中,当变量未定义时,通常使用OR运算符||
来提供替代值:
return variable || defaultPhrase || ''
如果variable
未定义,它将计算为false,然后将计算测试的第二部分,如果它也未定义,您仍然可以返回一个空字符串。
在函数调用中引用没有作用域的未定义变量是一个javascript错误。因此,如果范围中不存在变量js_shutdown
,那么这个:
Ext.Msg.show({title: phrase(js_shutdown,'Shutdown'), //...
是一个错误。
例如,此代码在调用phrase()
函数的线路上导致错误:
var Ext = {};
Ext.Msg = {};
Ext.Msg.show = function() {console.log("success")};
function phrase(variable, defaultPhrase) {
return(variable || defaultPhrase);
}
Ext.Msg.show({title: phrase(js_shutdown,'Shutdown')});
因为javascript引擎无法在任何范围内找到jsshutdown。
但是,这还可以:
var Ext = {};
Ext.Msg = {};
Ext.Msg.show = function() {console.log("success")};
function phrase(variable, defaultPhrase) {
return(variable || defaultPhrase);
}
Ext.Msg.show({title: phrase(window.js_shutdown,'Shutdown')});
您可以在这里看到这一点:http://jsfiddle.net/jfriend00/JFz6R/
因为您已经告诉JS引擎在哪里查找JS_shutdown,当它不在那里时,它只会将undefined传递给短语函数(根据您的需要)。
使用逻辑OR运算符:
var phrase = variable || defaultPhrase;
或内联:
Ext.Msg.show({title: (js_shutdown || 'Shutdown')), //...
在没有可能的安全问题的情况下,我通常会像title: js_shutdown || 'Shutdown'
一样对其进行编码。
不应该是:吗
var phrase = function (variable, defaultPhrase){
if(variable == undefined){
return defaultPhrase;
}else{
return variable;
}
}