首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从javascript中的字符串启动限定作用域的函数

从javascript中的字符串启动限定作用域的函数
EN

Stack Overflow用户
提问于 2012-11-07 17:45:23
回答 1查看 63关注 0票数 1

让我们来定义一只狗:

代码语言:javascript
运行
复制
function Dog() {}

现在,让我们定义一个自动执行的函数,它将Dog作为参数传递:

代码语言:javascript
运行
复制
(function(dogClassName) {

    var someServerSideLogicResolvesClassName = "dogClassName";
    //Iniate class name from the server side string
})(Dog);​

在谷歌搜索之后,我发现我应该使用

代码语言:javascript
运行
复制
new window["dogClassName"]();

代码语言:javascript
运行
复制
new this["dogClassName"]();

但是因为它是一个限定了作用域的变量,所以它不存在于全局名称空间(没有窗口)中,并且thisundefined;我不知道如何在不使用某种计算的情况下实现这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-07 17:57:56

好的,假设你试图访问一个没有全局设置的构造函数,那么你的问题的答案很简单:你不能这样做。闭包的作用域由不同的引擎进行不同的管理。如果返回的函数没有显式引用构造函数,V8甚至可能会GC构造函数……

没有什么神奇的方法可以将完整的外部作用域作为对象获取

唯一的解决方案是创建一个名称空间对象:

代码语言:javascript
运行
复制
(function()
{
    var constructors = {Constructor1: function(){},
                        Constructor2: function(){}};
    return function()
    {
        var className =getClassNameViaAjax();
        if (constructors.hasOwnProperty(className))
        {
            return new constructors[className]();
        }
        if (window[className] instanceof Function)
        {//fallback
            return new window[className]()
        }
        throw className + ' Does not exist in closure, nor in global scope';
    };
}());

看看this question,在我看来,它似乎是相关的,甚至是重复的。

犹豫不决更新,但为了完整性

有一种方法可以在作用域链中使用变量的值作为引用,但它确实需要邪恶函数中最多的邪恶see in the specification,正如您可以使用的那样,eval将保留this绑定,并重新初始化作用域链。使用'strict mode';时除外

因为您是从ajax响应中获取构造函数名称,并且eval很容易被利用,所以不要这样做!这是一种“理论上,你可以...”一件事。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13267066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档