在对象文字中,在函数定义中,我调用另一个函数并将其传递给函数定义。
...
var myObjLiteral = {
...
, check_on: function(param1, param2) {
ref.otherFunction(param1, function(param2){checkJson(param2)});
}
}
otherFunction将按原样接收param1,但不会按原样接收param2。
为什么呢?
因为传递给其他函数的第二个参数创建了它自己的闭包,而param2实际上是一个新的引用,它在check_on的定义中覆盖了param2的外部引用。
我认为这是正确的。但更重要的是,如何将param2的值传递给我作为第二个参数传递给otherFunction的函数定义?
由于
答案 0 :(得分:3)
只需删除param2 param,(不需要anotherParam,只是为了说明问题)
otherFunction(param1, function(anotherParam) {
checkJson(param2);
});
因此该函数将成为param2的闭包。
让我们假设otherFunction是这样的:
otherFunction = function(p1, callback){}
然后回调(123456)将使另一个Param = 123456;
答案 1 :(得分:0)
这是因为当您在第二个函数中声明param2
时,它会在第二个函数内创建一个具有该名称的新变量。因此关闭被打破了。删除param2
的声明或重命名它以使闭包工作。
这tutorial帮助我更好地理解了闭包是如何工作的。
答案 2 :(得分:0)
以下是我如何帮助我解释安德鲁对自己的回答。您可能会发现这很有用:
var myObjLiteral = {
check_on: function (param1, param2) {
var _this = this;
this.otherFunction(param1, function () {
_this.checkJson(param2);
});
},
otherFunction: function(param1, callback) {
console.log('otherFunction', param1); // otherFunction 1
callback();
},
checkJson: function (param2) {
console.log('checkJson', param2); // checkJson 2
}
}
myObjLiteral.check_on(1, 2);