JavaScript dash抛弃了ReferenceError

时间:2014-03-20 21:35:24

标签: javascript

以下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不友好的字符。例如“我的例子”和“我的例子”或“我的例子”。

http://en.wikipedia.org/wiki/CamelCase

3 个答案:

答案 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的其他答案,因为它们完全相关。

相关问题