更改的Javascript功能变量范围(Change variable scope of funct

2019-09-16 08:59发布

我不感兴趣的呼叫或应用来改变this参考。 只是我自己的利益,我有一个想法另一个玩需要的JavaScript,这将使一些清洁剂的定义技术,目标是不是必须通过数组或引用双模块名称为我的定义。

我使用的toString和eval上的功能,但我不知道是否有这样做更安全或更有效的方式将样品溶液(只是一个概念证明)。

// Sample module libraries (would probably be in their own files)
someModules = { 
    testModule: {test: function(){console.log("test from someModule")}},
    anotherModule: { doStuff: function(){console.log("Doin stuffs!");}}
};

sampleRequire = function() {

    // Load the modules
    for (var i=arguments.length-2; i>=0; --i){

        // Create a local variable reference to the module
        eval ('var '+arguments[i]+' = someModules.'+arguments[i].toString());
    }

    // Redefine the programmer's function so that it has my local vars in its scope
    eval("var fn = "+arguments[arguments.length-1]);

    return fn;
}

// Main code...
sampleRequire( 'testModule', 'anotherModule',
    function(){ 
        testModule.test();
        anotherModule.doStuff();
    }
)();

编辑:

尖尖作出了良好的出发点,这将彻底摧毁主要功能的范围,这很多时候是不可接受的。 理想情况下,我想看到正在向函数的范围模块变量,而重挫的其他范围的变数(与模块名称的例外 - 程序员必须知道不是两件事情使用相同的名称)。 我敢打赌,这可能是不可能的,但我还是喜欢看一些想法。

另一个目标是灵活地做到这一点,而不必每个模块添加参数的主要功能。 否则,我们又回到了原点与CommonJS的风格(这我并不想打,只是好奇范围!)。

Answer 1:

我往往会说“你这样做是错误的”。 使用未声明的变量是不是一个好主意,即使你可以。

下面是该模块写入全局对象另一个黑客。 然而,这可能对从main函数调用的方法的副作用。

sampleRequire = function() {

    var cache = {};
    var moduleNames = [].slice.call(arguments);
    var fn = moduleNames.pop();

    return function () {
        var result, name, i;
        // export modules to global object
        for (i = 0; i < moduleNames.length; i++) {
            name = moduleNames[i];
            cache[name] = window[name]; // remember old values
            window[name] = someModules[name];
        }
        result = fn.apply(null, arguments);
        // restore original global stuff
        for (i = 0; i < moduleNames.length; i++) {
            name = moduleNames[i];
            window[name] = cache[name];
        }
        return result;
    };
}

我也尝试了一些魔法与with关键字,这是基本上是你想要正是制造。 然而,它看起来像它不工作没有eval在这种情况下。



Answer 2:

我想不出做什么你以后的任何其他方式。 我也怀疑这可能是为数不多的使用情形之一eval是不是罪恶 。 但千万记住,这些模块可以依靠自己的范围,这可能打破他们。



Answer 3:

如何是这样的:

someModules = { 
  testModule: {test: function(){console.log("test from someModule")}},
  anotherModule: { doStuff: function(){console.log("Doin stuffs!");}}
};

function requireModules() {
  var all = [];
  for (var i = 0, l = arguments.length; i<l; i++) {
    all.push(someModules[i]);
  }
  return all;
}

(function(testModule,anotherModule){
  testModule.test();
  anotherModule.doStuff();
}).apply(null,requireModules('testModule','anotherModule'));


文章来源: Change variable scope of function in Javascript