gpt4 book ai didi

javascript - 在 Javascript 中更改函数的变量范围

转载 作者:行者123 更新时间:2023-11-30 05:58:53 25 4
gpt4 key购买 nike

我对调用或申请更改 this 引用不感兴趣。出于我自己的兴趣,我正在考虑为 javascript 提供另一种 require 技术的想法,它可以使定义更清晰,目标是不必为我的定义传递数组或重复引用模块名称。

我有一个在函数上使用 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();
}
)();

编辑:

Pointy 提出了一个很好的观点,即这将完全破坏 main 函数的作用域,这通常是 Not Acceptable 。理想情况下,我希望看到模块变量被添加到函数的范围内,而不破坏其他范围内的变量(模块名称除外——程序员必须知道不要对两件事使用相同的名称)。我敢打赌这可能是不可能的,但我仍然希望看到一些想法。

另一个目标是灵活地执行此操作,而不必为每个模块向主函数添加参数。否则,我们将回到 CommonJS 样式的原点(我不是要与之抗争,只是对范围感到好奇!)。

最佳答案

我倾向于说“你做错了”。使用未声明的变量从来都不是一个好主意,即使您可以。

这是将模块写入全局对象的另一个 hack。但是,这可能会对从主函数调用的方法产生副作用。

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,它似乎无法工作。

关于javascript - 在 Javascript 中更改函数的变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10031399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com