所以,我有一个模块化组件......这意味着它可能出现在多个应用程序中。这些都是内部的,因此当我们添加更多产品时,组件的行为可以“增长”。
总的来说,可能有更好的设计来完成我想要完成的任务,但为了快速开发,我这样做:
function someFunc(opt) {
if(typeof(taEnvironment) !== "undefined")) {
if(taEnvironment === "webApp") {
// do stuff when a variable taEnvironment exists and its value is "webapp"
}
}
}
每次我需要检查“webApp”时这样做很麻烦,所以我想把它抽象一点点。建议的重构看起来有点像这样:
function someFunc(opt) {
if(environment("webApp")) {
// do stuff when a variable taEnvironment exists and its value is "webapp"
}
}
//...elsewhere in the same module...
function environment(env) {
var envSet = false;
if(typeof(env) === "undefined") {
return envSet;
}
if(typeof(taEnvironment) !== "undefined")) {
if(taEnvironment === env) {
envSet = true;
}
return envSet;
}
两部分问题:
即使只是查看第一个未重构的片段;这是检查这些变量的常用方法吗?您不能将typeof检查与值检查结合使用,因为如果它未定义,您将在值检查中失败。所以首先我检查typeof为“undefined”,然后嵌套在里面,我检查值。它看起来像是这样做的唯一方法,但如果有更好的模式,我就全都听见了!
根据#1的答案 - 如果#1是合理的或预期的做事方式,那么拟议的重构是否有意义?或者我没有创造任何显着的效率?
答案 0 :(得分:3)
您可以同时检查所有条件。 &&
运算符将停在第一个false
结果:
function environment(env) {
return typeof taEnvironment !== 'undefined' &&
taEnvironment === env;
}
答案 1 :(得分:2)
这是有道理的,尽管你可以采取一些步骤,让后代更容易。
当可重用函数返回布尔值时,您可以通过将函数置于问题形式(例如isEnvironment(x)
而不仅仅是模糊的environment(x)
您还可以通过返回条件taEnvironment === env
的评估而不是设置变量然后返回该变量来简化函数本身。
这是您的功能的清理版本:
function isEnvironment(env) {
if(typeof taEnvironment === "undefined") {
return false;
}else{
return taEnvironment === env;
}
}
答案 2 :(得分:1)
这是检查这些变量的常用方法吗?
是的。
拟议的重构是否有意义?
是。您也可以使用try...catch
,但这完全取决于您:
function environment(env) {
try {
return typeof env !== 'undefined' && taEnvironment === env;
} catch (e) {
return false;
}
}
注意:typeof
不是函数,而是操作符。
答案 3 :(得分:0)
当"变量"时,我最近也从hasOwnProperty获得了里程数。我想检查一个离散变量本身,但它是一个对象的预期属性。
所以,给定某种标志对象:
flags = {
appStarted: true,
userAuthenticated: true
}
我可能需要查看用户是否做了某些事情。我可以将对象初始化为thingDone: false
,然后在条件中检查真相;或者我不能用默认值初始化并检查它是否已设置:
if (flags.hasOwnProperty("thingDone")
这个答案超出了原始问题的范围(具体是关于检查变量),但对于本来可以检查if(typeof flags.thingDone === "undefined")
的人来说,这可能是有用的。它是另外六个中的六个(即同一个东西),但我发现它在语义上更有意义。您的里程可能会有所不同。