假功能本地变量

时间:2011-06-03 22:23:44

标签: javascript function scope

有没有办法在这里引入局部变量“iWantThisHere”,所以我可以调用obj.n()

var obj = { 
    test: "sure", 
    n : function(){ console.log(iWantThisHere); }
};

我试过:

function fake(methods){
    var F =  new Function('methods', "var iWantThisHere = 'u have it', obj = {}; for( var meth in methods){ obj[meth] = methods[meth] } return obj;");

    return F(methods); }

console.log(fake(obj), fake(obj).n());

我不想在这里使用全局变量。想象一个模块系统,其中每个模块使用例如util类,其例如在App对象中定义。所以我总是要输入例如App.utils.map或类似的东西。有一个这个util函数的快捷方式会很好,这是模块上下文本身的一个局部变量。

EDIT ---没有办法做到这一点----

3 个答案:

答案 0 :(得分:1)

如果您的问题是“如何将新的命名值填入现有的范围?”,答案是您不能。你最接近的是:

var obj = (function() {
  var iWantThisHere = "whatever";
  return {
    test: "sure",
    n: function() { var x = iWantThisHere + "yaay I have my special variable"; }
  };
})();

它为您提供原始示例中的“obj”,加上该对象中定义的任何函数,您可以访问它们共享的“相对全局”变量。

答案 1 :(得分:1)

介绍一个闭包:

var obj = (function(){
    var R = {};

    R.iWantThisHere = 5;

    R.log = function() {
        console.log(R.iWantThisHere);
    }

    return R;
})();

演示:

> obj.log()
5
> obj.iWantThisHere = 6
> obj.log()
6

通过创建将变量限制在范围内的函数,这是进行javascript编程的最常见(我敢说推荐)方式。这是必要的,因为javascript没有块级范围。

答案 2 :(得分:1)

有什么特别的理由这么做吗?为什么不在obj.n

中为函数添加一个参数
var obj = { 
  test: "sure", 
  n : function(iWantThisHere){ console.log(iWantThisHere); }
};

obj.n("yeah");

甚至更简单(虽然范围变得更加丑陋):

var iWantThisHere = "dance time";
var obj = {
  test: "sure", 
  n : function(){ console.log(iWantThisHere); }
};
obj.n();

或者使用闭包,以及有关如何将公共和私人部分分开的一些细节:

var obj = (function() {
  var privateVariable = "i'm private";

  function privilegedMethod() {
  };

  return {
    iWantThisHere: "",
    test: "sure",
    n: function() {
      console.log(this.iWantThisHere);
    },
    publicVariable: "i'm public",
    publicMethod: function() {}
  };
})();

obj.iWantThisHere = "hi";
obj.n(); // logs "hi"
obj.addedMethod = function() { console.log("I've been added"); }
obj.addedMethod(); // logs "I've been added";
console.log(obj.privateVariable); // logs undefined (unavailable outside closure)
console.log(obj.publicVariable); // logs "i'm public"

其他答案也很好地涵盖了封闭符号。但最重要的是,如果你可以在各处注入新的变量,那么闭包和限制范围在JavaScript中毫无意义。