我有很多使用全局变量的js方法,如:
function DoSomething() {
var val=$('#'+clientId).val();
.
.
.
}
DoSomething使用clientId变量。问题是clientId并不总是被声明,因此我得到了未声明变量的例外
我有很多这样的地方,并添加if (typeof clientId == "undefined")
检查到处都是很多工作和代码重复(复制检查)。我可以解决它吗?例如,如果未声明变量,则使用返回null的方法? (以这种方式,我可以控制返回值,例如在未定义的情况下)
答案 0 :(得分:1)
在我看来,如果您的代码路径在定义之前尝试使用全局变量,那么您的代码就会被破坏。您需要为其提供默认值,您需要重新排序代码的加载或执行,或者在环境未初始化时需要阻止代码运行。
当且仅当它已经如此定义时才可以初始化变量:
var clientId = clientId || "foo";
您可以将它放在使用它的任何模块的顶部。当且仅当它尚未初始化时,这将使用您想要的任何值初始化它。
您还可以构建自己的访问器函数,而不是直接访问变量,如下所示:
// put this somewhere early in the JS loading process
function getClientId() {
if (typeof window.clientId !== "undefined") {
return(window.clientId);
} else {
return("foo"); // whatever default value you want to return here
}
}
// use it like this:
function DoSomething() {
var val=$('#'+getClientId()).val();
.
.
.
}
或者,您可以创建一个测试它的全局函数:
function isClientId() {
return(typeof window.clientId !== "undefined");
}
// use it like this:
function DoSomething() {
if (isClientId()) {
var val=$('#'+clientId).val();
.
.
.
}
}
答案 1 :(得分:0)
全球变量是邪恶的,如果可能的话应该避免。
在您给出的示例中,将客户端ID声明为参数会更好,如下所示:
function DoSomething(clientId) {
var val=$('#' + clientId).val();
.
.
.
}
这样,您不会受到全局变量问题的影响,也不会担心副作用(由其他方法引起的值更改)。
祝你好运!答案 2 :(得分:0)
尝试:
var isExists =clientId || false;
但要小心
如果ClientId==0
它会显示为false。
答案 3 :(得分:0)
我用:
if (typeof (foo) != 'undefined')
alert ('foo is defined');
答案 4 :(得分:0)
如果声明了变量本身(而不是仅具有未定义的值),那么您只需使用( clientId || 'default value' )
即可。这要求您在全局范围内有var clientId;
或类似的东西(这是一种不好的做法,BTW)。
如果您没有保证clientId
已在某处声明,那么使用上述结构仍会抛出未定义的变量错误。在这种情况下,您可以使用:( typeof clientId == 'undefined' ? 'default value' : clientId )
。
答案 5 :(得分:0)
只是一个想法:所有变量都是命名空间的属性,直到全局命名空间(在浏览器中,即window
)。未分配的属性评估为undefined
。因此,如果您想知道是否已分配变量,则可以使用if (property in namespace)
。如果它涉及浏览器中的全局变量:if (clientId in window)
。现在你可以用它来创建一个函数:
function exists(label, namespace){
namespace = namespace || window;
return namespace[label] || false;
}
// possible usage
function DoSomething() {
var val=$('#'+( exists('clientId')||0) ).val();
// ...
}
答案 6 :(得分:0)
虽然我喜欢这些答案,但我会采用简单的方法......只需声明var clientId;在你的脚本之上。如果你没有通过任何值,那么:
var clientId;
if(!clientId){
//will reach here cause declared but with no value
}
但
var clientId;
clientId = 132;
if(!clientId){
}else{
//will reach here cause it has a value
}
所以
function DoSomething() {
if(clientId){
可行吗