以下JavaScript ......
if (eval('typeof admin_post_css_theme_dark-moon)=='function')) {/**/}
...触发以下错误消息...
错误:ReferenceError:未定义月亮
在这种情况下,我唯一可以真正区分的是其他主题的名字中没有短划线......
if (eval('typeof admin_post_css_theme_silver)=='function')) {/**/}
...不会触发任何错误。
那么'dark'和'moon'之间的短划线如何触发此错误?
编辑:我想花一点时间,并建议遇到此问题的其他人应该使用camelCase或类似内容。一般来说,我自己使用'名字'和'基础'。 'base'是URL友好的版本,'name'包含URL不友好的字符。例如“我的例子”和“我的例子”或“我的例子”。
答案 0 :(得分:6)
JavaScript变量名称不能包含破折号,但对象属性却可以。例如,像这样的东西可以工作:
var themes = {
'admin_post_css_theme_dark-moon': function () {},
'admin_post_css_theme_silver': function () {}
};
if (typeof themes['admin_post_css_theme_dark-moon'] === 'function') {
/**/
}
答案 1 :(得分:4)
主要是因为' - '不是javascript中的有效标识符,而是减号。你的eval本质上是试图获得表达式admin_post_css_theme_dark 减去月亮的类型。 javascript中的有效标识符(即变量,函数或对象名称)是[A-Za-z0-9_ $],但不能以数字开头(注意这是一个正则表达式,此上下文中的连字符表示范围,即a到z,以防万一不清楚)
我对这个问题的演变将是你如何预期定义admin_post_css_theme_dark-moon
,因为你预期它会以某种方式/代码在哪里,然后依次测试它是否是一个函数。
因为这样做绝对不可能
var admin_post_css_theme_dark-moon = function(){...};
//or
admin_post_css_theme_dark-moon = function(){...};
但是可以这样做。
window['admin_post_css_theme_dark-moon'] = function(){...};
或最好使用您自己的对象
var Themes = {};
Themes['admin_post_css_theme_dark-moon'] = function(){...};
//or
var Themes = {
'admin_post_css_theme_dark-moon' : function(){...};
}
作为对象属性,如果由字符串索引引用(即在[]之间作为字符串)不受标识符规则的约束。
然后当然你的eval也必须改变
类似
if (eval("typeof window['admin_post_css_theme_dark-moon']")=='function')) {/**/}
//or
if (eval("typeof Themes['admin_post_css_theme_dark-moon']")=='function')) {/**/}
注意使用交替的“和”,这样你就不必逃避
答案 2 :(得分:0)
我改变了......
eval('typeof '+my_object)=='function')
...到...
eval('typeof \''+my_object+'\'')=='function')
我没有机会编辑这个,所以问题可能更简洁。对于那些只看这个答案的人,请查看OJay和sabof的其他答案,因为它们完全相关。