我觉得我想尝试做一些超级简单的事情,但只是对它愚蠢.
我想要做的就是查看先前是否已设置变量,如果它没有,请将其设置为默认值....这里是一个示例:
if(!embed_BackgroundColor) { var embed_BackgroundColor; embed_BackgroundColor = "#F4F4F4"; }
所以,一旦你停止嘲笑我的代码....为什么它会覆盖变量,无论如何?
请保佑我的神经;)
专业风格:
var SomeVar = SomeVar || 'Default Value';
if (typeof variable === 'undefined') { // variable is undefined // eg: // var variable = "someValue"; }
在这种情况下,使用三元运算符将是一个很好的编码实践.与typeof相比,你也不需要有三个相同的符号.这是最简洁的解决方案:
b = typeof(b) == 'undefined' ? 0 : b;
这有希望节省你的手一些时间.
要真正回答你为什么会发生这种情况的问题 - 这只是两年多一点的时间:D - ,这是因为可变的提升.
基本上,在全局作用域内或在函数内执行代码之前有一个阶段,其中代码被扫描所有var
和function
声明(不要与函数表达式混淆,但这是一个不同的故事).
然后,所有这些变量和函数都在当前作用域内声明,之后才会实际运行代码.
无论它们在代码中的位置如何,都会发生这种情况,其范围对应于函数体,而不是语句块.而且这使得这更加反直觉,即使你在声明中为变量设置初始值,它们仍将保持"空",直到在正常执行流程中再次达到声明.
所以当你写:
if(!embed_BackgroundColor) { var embed_BackgroundColor; embed_BackgroundColor = "#F4F4F4"; }
实际发生的是这个:
扫描代码以进行var
声明.embed_BackgroundColor
在此范围内声明,无论它是否已经声明.其初始值未定义.
代码的执行开始.该if
声明已经运行.变量的声明,但它的价值是不确定的,所以条件为真.使用typeof
不会帮助您区分未声明和声明但尚未设置的变量.无论如何它没有任何区别.
该var
声明由代码的正常流量达到.如果你给变量一个初始值,它现在就已经设置好了.在这种情况下没有任何反应
embed_BackgroundColor
设置为值"#F4F4F4"
.
所以,底线是:您可以typeof variable == 'undefined'
像在其他答案中看到的那样使用,或者甚至像您最初使用的那样使用简单的"!变量",但不要使用var
或者会破坏一切.
我更喜欢这种语法:
embed_BackgroundColor = embed_BackgroundColor || "#F4F4F4"
不能比这简单得多!它似乎工作,即使它已经变了.
如果它是一个全局变量,我喜欢这样做:
var defineMe = window.defineMe || 'I will define you now';
使用窗口命名空间很重要,因为引用未定义的变量会导致非常糟糕的错误,但引用未定义的属性则不会.