我正在开发一个javascript框架。我有几个独立的脚本,如下所示:
core.modules.example_module = function(sandbox){
console.log('wot from constructor ==', wot);
return{
init : function(){
console.log('wot from init ==', wot);
}
};
};
从另一个外部脚本调用此函数。我正在尝试将变量传递给此函数,以便可以访问它们 without using the this keyword.
以上示例将错误地说wot未定义。
如果我将函数包装在匿名函数中并在那里声明变量,我会得到预期的期望结果
(function(){
var wot = 'omg';
core.modules.example_module = function(sandbox){
console.log('wot from creator ==', wot);
return{
init : function(){
console.log('wot from init ==', wot);
}
};
};
})();
我要做的是在范围链中进一步声明变量,以便可以在模块中访问它们而不使用像第二个示例那样的this关键字。我不相信这是可能的,因为它看起来函数执行范围在函数声明时被封闭。
update
澄清我在哪里尝试定义wot。在一个单独的javascript文件中,我有一个对象,它调用像这样的寄存器模块函数
core = function(){
var module_data = Array();
return{
registerModule(){
var wot = "this is the wot value";
module_data['example_module'] = core.modules.example_module();
}
};
};
答案 0 :(得分:2)
考虑这个例子,使用你的代码
var core = {}; // define an object literal
core.modules = {}; // define modules property as an object
var wot= 'Muhahaha!';
core.modules.example_module = function(sandbox){
console.log('wot from creator ==', wot);
return {
init: function() {
console.log('wot from init ==', wot);
}
}
}
// logs wot from creator == Muhahaha! to the console
var anObject = core.modules.example_module();
// logs wot from init == Muhahaha! to the console
anObject.init();
只要wot
在core.modules.example_module
的范围链中的某处被定义,它就会按预期运行。
稍微偏离主题,但你已经触及了功能的范围。函数具有词法范围,即它们在定义它们的位置创建它们的范围(而不是执行)并允许创建闭包;当函数保持到父父作用域的链接时,即使父函数已经返回,也会创建一个闭包。
答案 1 :(得分:2)
您正在寻找的是“dynamic scoping”,其中绑定通过搜索当前的调用链来解决。它在Lisp系列之外并不常见(Perl通过local
关键字支持它)。 JS中不支持动态作用域,它使用lexical scoping。
答案 2 :(得分:-1)
将var wot;
放在构造函数的开头应该这样做
core.modules.example_module = function(sandbox){
var wot;
wot = 'foo'; //just so you can see it working
console.log('wot from constructor ==', wot);
return{
init : function(){
console.log('wot from init ==', wot);
}
};
};