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