可以在严格模式下使用字符串值调用函数吗[重复]

Posted

技术标签:

【中文标题】可以在严格模式下使用字符串值调用函数吗[重复]【英文标题】:Can a function be called using string value in strict mode [duplicate] 【发布时间】:2015-03-15 11:13:38 【问题描述】:

我想知道是否可以通过传递字符串名称来调用函数。以下是基本架构:

javascript

"use strict";
function foo()
   var f = this;
   f.fn = function(o)return fn(o)

   function fn(o)
      o.name();
   

   function a()
      alert('a');
    

    function b()
      alert('bb');
    



var f = new foo();


f.fn(name:'a'); 
f.fn(name:'b');

代码设置在http://jsfiddle.net/rexonms/9c7bnkc9/。

【问题讨论】:

【参考方案1】:

您可以使用eval

function foo()
    var f = this;
    f.fn = function(o)return fn(o)

    function fn(o)
        eval(o.name + '()');
    

    function a()
        alert('a');
    

    function b()
        alert('bb');
    



var f = new foo();


f.fn(name:'a');
f.fn(name:'b');

这里是 jsFiddle:http://jsfiddle.net/9c7bnkc9/2/

【讨论】:

你可以使用 eval 但你可能不应该。如果您唯一的解决方案是 eval,您可能应该考虑更改设计的其他部分以避免 eval。 @JamesMontagne 在 99.9% 的情况下,你不应该使用 eval,但你必须知道它是如何工作的,以及你可以用它做什么。在我的职业生涯中有几个需要使用 eval 的案例。顺便说一句,这是一个问题 - 这是完全正确的答案。 (eval***.com/questions/9464921/… 没有答案)。 @JamesMontagne 答案标记为已接受:“您无法通过字符串获取对局部变量的引用。您必须将本地对象添加到命名空间:”- FACEPALM(来自此处***.com/questions/9464921/…) 我没有否决您的答案,因为它是正确的,因为 eval 是在问题中列出的约束条件下的唯一解决方案。但是,除了该答案中的开场白之外,我同意答案其余部分中提出的解决方案。我将问题标记为重复,因为我确实认为这些问题是重复的。但是,对于该重复问题,目前没有eval 答案。您可以随意添加对该问题的答案,因为该问题现已关闭。我建议至少对 eval 是危险的事实做一点说明,尽管这完全取决于您。 另外,如果你觉得我的关闭作为重复是不合理的,你可以投票重新打开(不确定代表阈值是多少)。您也可以对该答案投反对票,并对开场陈述是错误的事实发表评论。

以上是关于可以在严格模式下使用字符串值调用函数吗[重复]的主要内容,如果未能解决你的问题,请参考以下文章

this指向问题——严格非严格模式,事件处理程序

js_递归函数在严格模式下的调用方法

在严格模式下复制 arguments.callee

JS严格模式

在严格模式下获取当前函数名

严格模式——let和const——箭头函数——解构赋值——字符串模板symbol——Set和Map——生成器函数