我有一个函数 - 让我们将其定义为function getdata(after){}
,将after
参数作为函数。很自然。此函数正在从其他函数运行,该函数在其范围内定义了一些变量:
$('.button').click(function(){
var rel = $(this).attr('rel');
var mooo = $(this).parent().offset().left;
getdata(function(){alert(rel);console.log(moo)});
});
如何以正确的方式传递这些变量,所以它与单击按钮时的效果真的相同?它不能是全局变量,因为用户可以通过垃圾邮件单击按钮,它应该保持变量在点击过程中完全正确,即使在10分钟之后将以随机顺序调用after
函数,因为如名称所示 - 它被称为AFTER ajax请求。
这只是一个例子 - 这个想法是这个after
函数也是可变的,从完全不同的地方调用。
好的,得到-1
,因为我不知道我要求的是什么,所以我试着解释这个问题。我真的不明白变量是作为变量传递的,当它作为变量的指针传递时,它可能会在它被传递给它的函数使用之前发生变化。
当我在一个函数中定义变量并将其传递给另一个函数时,它是指针还是独立变量?当我再次调用原点函数时,这些变量会改变 - 它会影响之前被“处理”的函数吗?或者变量之前的单词var意味着 - 将它定义为完全新变量,并且每次调用带有var的函数时,它会将此变量在内存中分配为全新变量,不依赖于任何发生的变量?
我通常是PHP,C和Delphi程序员,我很难理解这些变量作用域是如何工作的,特别是当所有内容都是异步和回调时。
答案 0 :(得分:2)
简单地说,在javascript中,简单类型(字符串,数字,布尔值)按值传递,而对象通过引用传递。 see this question for a real detailed answer
如果您不知道要处理多少个参数(或其类型),那么您可以使用arguments array
var getdata = function(){
//your function logic
//arguments is an array with all the args
//the last one is the "after" function
var after = arguments[arguments.length-1];
return after(arguments);
};
$('.button').click(function(){
var rel = $(this).attr('rel');
var mooo = $(this).parent().offset().left;
getdata(rel, moo, /*add all the arguments you want here...*/, function(args){
alert(args[0]);
console.log(args[1])
});
});
答案 1 :(得分:1)
我不确定你在问什么,但这是rvignacio答案的变体,允许任意数量的参数getdata
和after
:
var getdata = function(after){
//your function logic
return after.apply(null, [].slice.call(arguments, 1));
};
$('.button').click(function(){
var rel = $(this).attr('rel');
var mooo = $(this).parent().offset().left;
getdata(function(rel_param, moo_param){
console.log(rel_param);
console.log(moo_param)
}, rel, moo);
});
答案 2 :(得分:1)
你无法完全按照你的描述去做。你要做的是将关联的闭包传递给回调。在JavaScript中,使用了变量的词法范围。这意味着
function outer (callback) {
var a = 1, b = 2, c = 3;
var inner = function () {
// This works because inner is defined inside of outer
// and has access to a,b,c
console.log(a,b,c);
}
inner();
callback();
}
outer(function() {
// This won't work because it doesn't know where to get a,b,c from
// Some languages may(could/allow?) this, JS doesn't
console.log(a,b,c);
});
因此,要解决您的问题,您必须通过将它们作为参数传递来指定您希望为回调提供哪些变量。 rvignacio和bfavaretto已经向您展示了如何做到这一点
胜利的好的,有办法,但它需要eval
,所以你不应该使用它。无论如何,这里很有趣。 eval()
确实在相同的范围内执行,因此通过在词法范围内添加eval并使用回调来调用它,您可以实现您想要的。再说一遍,我不建议你这样做。它打破了封装,回调不应该知道它的调用者的私有。但只是为了它的乐趣.... http://jsfiddle.net/zbwd7/1/
/**
* The callback will accept a single argument, it's a function that takes the name
* of the variable you want to use and returns its value. DON'T EVER DO THIS IN REAL CODE
* @callback {function(string): *} getVar The function that gives you access to the
* caller's scope
* @callback.varName {string} The name of the variable to retrieve
* @callback.return {*} The value of the variable
*/
function outer (callback) {
var a = 1, b = 2, c = 3;
function getVar(varName) {
return eval(varName);
}
callback(getVar);
}
outer(function(getVar) {
// outputs one, two, three
console.log(getVar("a"), getVar("b"), getVar("c") );
});