将值传递给稍后调用的函数

时间:2013-11-22 01:41:50

标签: javascript

我有一个变量,我想在稍后调用的函数中使用它。情况如下:

var a = 'something';

var mapFun = {
    map: function (doc) {
        if(doc.a === a) {
            emit(doc, doc);
        }
    }
};

所以map()是一个稍后在不同的上下文中调用的函数。因此,在调用函数时,a未定义。这是有道理的,但我想知道如何在函数中访问a的值。例如:

调用该函数时,

if(doc.a === a)应为if(doc.a === 'something')

编辑:我理解我设置示例的方式使得a似乎是一个全局变量。不是这种情况。 map()内的mapFun方法在一个无法访问a的函数内被调用

5 个答案:

答案 0 :(得分:3)

将变量放在全局范围内以便以后可以访问它是任何语言的反模式。我很惊讶JavaScript程序员提出的所有4个答案都会建议做这样的事情。

假设您需要将mapFun.map传递给someLib.callBack,在您传递地图时,您知道可以使用闭包的值:

var a = 22;
someLib.callBack = function(doc){
  mapFun.map(doc,a);
};

看起来someLib会传递“a”,但它只会传递“doc”。如果您必须稍后更改“a”的值,则取决于范围。如果传递a然后重新分配它将不会改变它所以你需要传递一个可以变异的对象。

var someLib = {
  callBack : function(fn){
    setTimeout(function(){
      fn("hello");
    },100);
  }
};
var mapFun = {
  map : function(doc,a){
    console.log("doc passed when called:",doc);
    console.log("variable a is:",a);
  }
};
(function(){
  var a = 22;
  someLib.callBack(function(doc){
    mapFun.map(doc,a);
  });
  a=44;//this is fine, same scope

  a=22;
  someLib.callBack(function(doc){
    mapFun.map(doc,a);
  });
  (function(a){
    a = "not changed";
  }(a));//doesn't change a because you assign it in a different scope

  var obj={};
  obj.a=22;
  someLib.callBack(function(doc){
    mapFun.map(doc,obj.a);
  });
  (function(obj){
    obj.a = "Hello World";
  }(obj));//changed a because you mutated the object
    //diffeerent scope doesn't matter here.
}());

如果闭包不是一个选项,你可以让myMap记住Trendy建议的a值。

答案 1 :(得分:1)

如果在不同的上下文中调用此函数时a不再在范围内,请尝试将a设置为全局,方法是将其放在窗口中。而不是var a = 'something';window.a = 'something';

答案 2 :(得分:1)

尝试执行var a = "something";,而不是window.a = "something";,尝试执行if(doc.a == window.a),然后通过执行{{1}}在代码中引用它。
如果这不起作用,我不知道会发生什么。
祝你好运!

答案 3 :(得分:1)

如果您正在尝试访问另一个函数范围内定义的变量,则需要从范围中提取变量,方法是将其存储在全局范围内或将其添加到全局范围内的对象原型中(IE是你试图传递“a”的对象。)

例如:

var mapFun = {
    map: function(){
        //do something here
        alert(this.a);
    }
};

mapFun.a = "something";

了解其工作原理:http://jsfiddle.net/z8Uvr/

答案 4 :(得分:0)

变量amapFun属于同一范围,因此它们通常应始终可用于彼此。

即使在另一个函数中调用.map()函数,声明函数仍然可以访问a

创建新范围时,您在该范围内创建的所有变量和函数都可以访问在同一范围内创建的函数和对象。

如果您在访问a时遇到问题,可以通过说window.a = 'something';

来使窗口(全局)对象可用

a添加到全局范围时要小心,因为它可能会导致冲突。

感谢@HMR指出