首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能动态地将局部变量添加到函数中吗?

你能动态地将局部变量添加到函数中吗?
EN

Stack Overflow用户
提问于 2012-01-20 04:01:15
回答 3查看 8.1K关注 0票数 13

我正在使用对象来命名我的JavaScript代码。这些对象通常包含使用applythis-pointer映射到对象本身的函数。但是,我发现每次要访问对象的其他函数或属性时都使用this-pointer是不方便的,特别是因为在许多情况下,我使用new-operator像使用类一样使用函数对象。如果是new this.Line(),我更喜欢写new Line()

如果你能像php用extract那样给函数添加局部变量,那就更好了(伪代码如下,它有点复杂)

代码语言:javascript
复制
var sample_object = {
  "some_function": function() {}
}

test() {
  extract(sample_object);
  some_function();   // imported from sample_object
}

这有可能吗?

EN

回答 3

Stack Overflow用户

发布于 2012-01-20 05:03:38

我非常肯定eval是您唯一的答案;但是您需要知道,如果有任何超出您控制范围的输入,它是不安全的

代码语言:javascript
复制
function dynamicArgs (varName, varValue) {
  eval("var " + varName + "=" + JSON.encode(varValue) );
  alert(a);
}

dynamicArgs("a", "value");

您可以看到这方面的问题。如果你的函数不知道它的名字,它怎么调用动态变量呢?我将其硬编码为a变量,因为我在调用它时传入了它,但这不是一个好的解决方案。唯一的解决方案是另一个eval。你真的应该考虑你需要做什么,以及这是否有用。但这是可行的。

这就是它的实际作用:http://jsfiddle.net/mendesjuan/GG3Wu/

代码语言:javascript
复制
function dynamicArgs (varName, varValue) {
  eval('var ' + varName + "='" + varValue + "';");
  alert(eval(varName));
}

dynamicArgs("f", "Here I am");

下面是一个与您正在执行的操作类似的示例:从this.MyConstructor http://jsfiddle.net/mendesjuan/AK3WD/创建变量

代码语言:javascript
复制
var ns = {
    MyConstructor: function(val) {
       this.prop = val;
    },

    runConstructor: function(val) {
      var Ctor = "MyConstructor";
      eval('var ' + Ctor + ' =  this.' + Ctor);
      return new MyConstructor(val);
    }
}


alert( ns.runConstructor("Hello").prop );

下面是一个例子,如果你想把所有的值从一个对象导入到作用域中;

http://jsfiddle.net/mendesjuan/AK3WD/1/

代码语言:javascript
复制
var ns = {
    MyConstructor: function(val) {
       this.val= val;
    },

    anotherProperty: 5,

    runConstructor: function(val) {
        // Bring all the variables from this into this scope
        for (var prop in this) {
            eval('var ' + prop + ' =  this.' + prop);
        }
        alert('Testing var anotherProperty: ' + anotherProperty);
        var obj =  new MyConstructor(val);
        alert('Created MyConstructor: its prop is ' + obj.val)
    }
}


ns.runConstructor("Hello");
票数 5
EN

Stack Overflow用户

发布于 2012-01-20 04:43:06

有一个有争议的with,它有一些great applications,但速度稍慢,容易出错。它会在严格模式下抛出一个错误(您应该始终选择该模式),并将被弃用。

代码语言:javascript
复制
var sampleObject = {
  someFunction: function() {},
  b: 10
}

with (sampleObject) {
    typeof someFunction // "function"

    var a = 42
    var b = 20
}

sampleObject.a // undefined
sampleObject.b // 20

请注意,在with-block中定义的新变量不会添加到对象中。然而,如果对象中已经有一个同名的属性,这个属性就会被修改(感谢@Rocket)。

只是为了好玩,这里是使用evalan implementation of extract (它比with更邪恶)。你可以用它做一些令人费解的事情,例如,如果你的对象有像sampleObject['x; while (true) { alert("Hi!") }']这样的属性。

票数 3
EN

Stack Overflow用户

发布于 2015-06-19 18:10:15

我是这样做的:

代码语言:javascript
复制
   function smObject ( object) {
    return function () {
        function getter(prop) {
            return function() {
                return this[prop];
            }
        }

        function setter(prop) {
            return function(data) {
                this[prop]=data;
            }
        }

        for (var o = 0; o < object.length; o++) {
            this[object[o]] = {};
            this['get' + object[o]] = getter(object[o]);
            this['set' + object[o]] = setter(object[o]);
        }
    }
}

现在您可以像这样实例化一个函数:

代码语言:javascript
复制
var fields = ['Name', 'Id', 'Other', '....' ]
var MyFunction = smObject( fields );
var myObject = new MyFunction();

// getter/setters
myObject.setId(5);
myObject.getId(); // will return 5

问候,Emanouil

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

https://stackoverflow.com/questions/8932496

复制
相关文章

相似问题

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