JavaScript破折号抛出引用错误

JavaScript破折号抛出引用错误,javascript,Javascript,下面的JavaScript if (eval('typeof admin_post_css_theme_dark-moon)=='function')) {/**/} …触发以下错误消息 错误:ReferenceError:未定义月亮 在这种情况下,我唯一能真正区分的是其他主题的名称中没有破折号 if (eval('typeof admin_post_css_theme_silver)=='function')) {/**/} …不会触发任何错误 那么,“黑暗”和“月亮”之间的短跑是如何触发

下面的JavaScript

if (eval('typeof admin_post_css_theme_dark-moon)=='function')) {/**/}
…触发以下错误消息

错误:ReferenceError:未定义月亮

在这种情况下,我唯一能真正区分的是其他主题的名称中没有破折号

if (eval('typeof admin_post_css_theme_silver)=='function')) {/**/}
…不会触发任何错误

那么,“黑暗”和“月亮”之间的短跑是如何触发这个错误的呢


编辑:我想花点时间,建议遇到这种情况的其他人采用camelCase或类似的方法。一般来说,我自己用“名字”和“基数”。“base”是URL友好的版本,其中“name”包含URL不友好的字符。在示例“我的示例”和“我的示例”或“我的示例”中


主要是因为“-”在javascript中不是有效的标识符,它是减号。你的评估本质上是试图得到表达式admin\u post\u css\u theme\u dark减去moon的类型。javascript中的有效标识符(即变量、函数或对象名)为[A-Za-z0-9_$],但不能以数字开头(注意,这是一个正则表达式,上下文中的连字符表示范围,即A到z,以防不清楚)

我对这个问题的理解是,您希望如何定义
admin\u post\u css\u theme\u 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(){...};
}
由字符串索引引用的As对象属性(即作为字符串在[]之间)不受标识符规则的约束

当然,你的评估也必须改变

差不多

if (eval("typeof window['admin_post_css_theme_dark-moon']")=='function')) {/**/}

//or

if (eval("typeof Themes['admin_post_css_theme_dark-moon']")=='function')) {/**/}

注意使用交替的“and”这样你就不必转义了,主要是因为“-”在javascript中不是一个有效的标识符,它是减号。你的转义本质上是试图得到表达式admin_post_css_theme_dark减moon的类型。javascript中的有效标识符(即变量、函数或对象名)是[a-Za-z0-9\$]但不能以数字开头(注意这是一个正则表达式,上下文中的连字符表示范围,即a到z,以防万一不清楚)

我对这个问题的理解是,您希望如何定义
admin\u post\u css\u theme\u 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(){...};
}
由字符串索引引用的As对象属性(即作为字符串在[]之间)不受标识符规则的约束

当然,你的评估也必须改变

差不多

if (eval("typeof window['admin_post_css_theme_dark-moon']")=='function')) {/**/}

//or

if (eval("typeof Themes['admin_post_css_theme_dark-moon']")=='function')) {/**/}

注意交替使用“and”,因此不必转义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') {
  /**/
}

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') {
  /**/
}
我改变了

eval('typeof '+my_object)=='function')
…到

eval('typeof \''+my_object+'\'')=='function')
我没有机会编辑这篇文章,这样问题就更简洁了。对于那些只看这个答案的人,请查看OJay和sabof的其他答案,因为它们完全相关。

我改变了

eval('typeof '+my_object)=='function')
…到

eval('typeof \''+my_object+'\'')=='function')

我没有机会编辑这篇文章,这样问题就更简洁了。对于那些只看这个答案的人,请查看OJay和sabof的其他答案,因为它们完全相关。

为什么要使用eval?没有它就无法做到这一点吗?我必须使用
eval
,这不是一个
eval
辩论问题。您的示例已损坏。我得到SyntaxError:意外的令牌函数。在任何情况下,
admin\u post\u css\u theme\u dark-moon
都不是有效的标识符。连字符将被解释为减法运算符。-要求javascript运行时从变量“admin\u post\u css\u them\u dark”中减去变量“moon”。cale_b在询问eval时试图提供帮助,因为如果您尝试在表达式中使用-进行eval,则运行时将尝试减去这两个变量。@John看起来您是在动态生成函数名?如果是这样的话,您仍然可以通过使用散列查找来避免
eval
,例如:
typeof window['admin\u post\u css\u theme\u dark'+'''.'+'moon']=='function'
为什么要使用eval?没有它就无法做到这一点吗?我必须使用
eval
,这不是一个
eval
辩论问题。您的示例已损坏。我得到SyntaxError:意外的令牌函数。在任何情况下,
admin\u post\u css\u theme\u dark-moon
都不是有效的标识符。连字符将被解释为减法运算符。-要求javascript运行时从变量“admin\u post\u css\u them\u dark”中减去变量“moon”。cale_b在询问eval时试图提供帮助,因为如果您尝试在表达式中使用-进行eval,则运行时将尝试减去这两个变量。@John看起来您是在动态生成函数名?如果是这样的话,您仍然可以通过使用散列查找来避免
eval
,例如:
typeof window['admin\u post\u css\u theme\u dark'+'''+'''+'moon']='function'
关闭,但在保持代码简洁的问题上接近于零。我会发布我的答案,但我仍然在投票,因为你给了我这个想法。谢谢接近但接近于零的问题,我保持代码简洁。我会发布我的答案,但我仍然在投票,因为你给了我这个想法。谢谢这不会引发错误,但是
的类型将始终是
“string”
我认为这不会达到您期望的效果。最有可能的情况是,它将返回false,例如,如果
my\u object
是类似
alert
的函数,
eval('typeof\''+my\u obejct+'\'')将返回
“st