这个范围是否可以在JavaScript中?

时间:2010-01-30 22:38:36

标签: javascript scope javascript-framework lexical-closures

我正在开发一个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();
    }
  };
};

3 个答案:

答案 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(); 

只要wotcore.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);
    }
  };
};