0

我需要从存储在变量中的名称创建一个函数。通常这很简单,我在使用之前已经完成了:

  var funcName = "theName";
  window[funcName] = function(){
    // code here
  };

但是在我的新用例中,我创建的函数需要位于一个名为the.Name. 所以我试图做的,但它不起作用是:

  var funcName = "the.Name";
  window[funcName] = function(){
    // code here
  };

它不起作用的原因是因为我无法引用window["the.Name"],因为那是无效的,正确的方法是window["the"]["Name"].

有没有人有解决这个问题的方法?基本上命名一个函数,当名称存储在变量中时,该函数将位于对象内。

4

4 回答 4

2

好的,我似乎明白你的问题了。

这里有一些代码可以帮助您入门。

/**
 * @param fn The function to bind.
 * @param path The object to bind to.
 * @param root The root object.
 */
function bindFunc(fn, path, root){
    path = path.split('.');
    var base = root;
    for(var i=0; i<path.length-1; i++){
        base = base[path[i]];
    }
    base[path[path.length - 1]] = fn;
}

bindFunc(function(){  }, 'the.Name', window);
于 2012-07-15T16:54:05.043 回答
1

我将猜测您正在尝试做一些“类似命名空间”的事情。这是一篇可以帮助您入门的文章(也有一些很好的示例代码)..

http://blogger.ziesemer.com/2008/05/javascript-namespace-function.html

于 2012-07-15T16:58:09.403 回答
1

如果您确定直到最后一个对象之前的所有对象都存在(最后一个对象也无法定义),那么最短的方法可能是使用reduce

var func = funcName.split(".").reduce(function(p, c) {
    return p[c];
}, window);
于 2012-07-15T17:14:44.823 回答
0

拆分字符串,以便您可以一次引用一个级别:

var names = funcname.split(".");
var f = window;
for (var i = 0; i < names.length - 1; i++) {
  f = f[names[i]];
}
f[names[names.length - 1]] = function(){...};
于 2012-07-15T16:56:59.527 回答