Javascript 将值传递给以后调用的函数

Javascript 将值传递给以后调用的函数,javascript,Javascript,我有一个变量,我想在以后调用的函数中使用。情况如下: var a = 'something'; var mapFun = { map: function (doc) { if(doc.a === a) { emit(doc, doc); } } }; 因此,map()是一个稍后在不同上下文中调用的函数。因此,调用函数时,a是未定义的。这是有道理的,但我想知道如何在函数中访问a的值。例如: var mapFun = {

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

var a = 'something';

var mapFun = {
    map: function (doc) {
        if(doc.a === a) {
            emit(doc, doc);
        }
    }
};
因此,
map()
是一个稍后在不同上下文中调用的函数。因此,调用函数时,
a
是未定义的。这是有道理的,但我想知道如何在函数中访问
a
的值。例如:

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

mapFun.a = "something";
调用函数时,
if(doc.a==a)
应该是
if(doc.a==something')


编辑:我理解我设置示例的方式,使其看起来好像
a
是一个全局变量。事实并非如此。
mapFun
中的
map()
方法在没有访问
a

权限的函数中被调用
a
如果在不同上下文中调用该函数时
a
不再在作用域中,请将其放入窗口,尝试将
a
设置为全局。而不是
var a='something'
do
window.a='something'

如果在不同上下文中调用此函数时,
a
不再在作用域中,请将其放入窗口,尝试将
a
设置为全局。而不是
var a='something'
do
window.a='something'

尝试,而不是做
var a=“something”,尝试执行
window.a=“某物”
然后通过执行
if(doc.a==window.a)
在代码中引用它。
如果那不起作用,我不知道什么会起作用。

祝你好运

尝试,而不是做
var a=“something”,尝试执行
window.a=“某物”
然后通过执行
if(doc.a==window.a)
在代码中引用它。
如果那不起作用,我不知道什么会起作用。

祝你好运

如果您试图访问在另一个函数的作用域中定义的变量,则需要将该变量从作用域中取出,方法是将其存储在全局作用域中,或将其添加到全局作用域中对象的原型中(即,您试图传递“a”的对象)

例如:

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

mapFun.a = "something";

查看其工作原理:

如果您试图访问在另一个函数作用域中定义的变量,则需要将变量从作用域中取出,方法是将其存储在全局作用域中,或将其添加到全局作用域中对象的原型中(即,您试图传递“a”的对象)

例如:

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

mapFun.a = "something";

看看这是如何工作的:

变量
a
mapFun
在同一范围内,因此它们通常应该彼此可用

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

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

如果您在访问
a时遇到问题,可以通过说
window.a='something',使窗口(全局)对象可以使用
a

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


感谢您指出,

变量
a
mapFun
在同一范围内,因此它们通常应始终相互可用

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

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

如果您在访问
a时遇到问题,可以通过说
window.a='something',使窗口(全局)对象可以使用
a

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


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

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

var a = 22;
someLib.callBack = function(doc){
  mapFun.map(doc,a);
};
看起来someLib将传递“a”,但它只传递“doc”。如果以后必须更改“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的值。

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

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

var a = 22;
someLib.callBack = function(doc){
  mapFun.map(doc,a);
};
看起来someLib将传递“a”,但它只传递“doc”。如果以后必须更改“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的值。

你说的“不同的上下文”是什么意思?
a是全局的,应该在以后可以使用。我的意思是,对象
mapFun()
被传递到一个超出此范围的函数中。完全分开。它没有访问
a
的权限,这应该已经起作用了,因为
a
与MapFun在同一范围内可用。这应该起作用,也许可以发布其余的代码。这段代码是否位于函数中?如果您将mapFun传入