我想取一个用户提供的字符串,例如"abs"
,并查看Math
object中是否存在具有该名称的函数。
所以,比如:
(.lookup Math "abs") ;; => <function>
(.lookup Math "abdominals") ;; => nil
我也想获得这个功能本身,所以这样的事情会起作用:
((.lookup Math "abs") -1) ;; => 1
如何访问常量?
(.lookup Math "PI") => 3.14159265
如果它与函数相同,则必须有一种区分函数和常量的方法。
我尝试过使用.hasOwnProperty
:
(print (.hasOwnProperty Math "E"))
但这会导致错误:
TypeError: cljsfiddle.Math is undefined
答案 0 :(得分:1)
使用js / Math,试试https://himera.herokuapp.com/index.html
Himera REPL v0.1.5
cljs.user> js/Math
#<[object Math]>
cljs.user> (.-abs js/Math)
#<function abs() { [native code] }>
cljs.user> (type (.-abs js/Math))
#<function Function() { [native code] }>
cljs.user> (fn? (.-abs js/Math))
true
答案 1 :(得分:1)
立即错误是Math
无法访问。解决方法是使用js/Math
。
ClojureScript:cljs.user> (.hasOwnProperty js/Math "E")
true
ClojureScript:cljs.user> (.hasOwnProperty js/Math "Earst")
false
然后,要从Math
中获取这些属性,必须使用eval
:
ClojureScript:cljs.user> (js/eval "Math.min")
#<function min() { [native code for Math.min, arity=2] }
>
ClojureScript:cljs.user> ((js/eval "Math.min") 1 3)
1
ClojureScript:cljs.user> (js/eval "Math.E")
2.718281828459045
在用户提供的字符串上使用eval
总是很危险,但首先要检查.hasOwnProperty
以确保您没有使用{{1运行任意代码}}。不过,它仍然不是最理想的。
最后,我们可以使用eval
和number?
来说明常量和函数之间的区别:
fn?