以下这一段javascript中的callback是否有问题?
/**
* @author F
* @description 用于与selectNull配合自动分析返回JSON数据生成select option值
*
* @param ajaxUrl
* @param subId
* @param dftValue
* @param IdKeyName
* @param TxtKeyName
* @param callbackFunc
* @returns {boolean}
*/
function selectChange(ajaxUrl, subId, dftValue, IdKeyName, TxtKeyName, callbackFunc) {
var subObj = document.getElementById(subId);
if (!subObj) {
alert('不存在的子对象!');
return false;
}
$.getJSON(ajaxUrl, function (json) {
subObj.options.length = 0;
subObj.options[0] = new Option(' 请选择 ', '');
subObj.options[0].className = 'dft-empty';
var j = 1;
for (var i in json) {
subObj.options[j] = new Option(json[i][TxtKeyName], json[i][IdKeyName]);
j++;
}
if (dftValue) {
subObj.value = dftValue;
}
if (callbackFunc) {
callbackFunc();
}
});
}
比如调用的代码:
#在 searchForm.init() 中调用(searchForm 有一个属性 formObj )
selectChange(this.jsonUrlAgent, this.formObj['AgentIdP'].id, this.filter['AgentIdP'], 'AGENTID', 'AGENTNAME', this.reqAgentIdI);
#但是到了 searchForm.reqAgentIdI() 方法中 this.formObj的this却变成了window了
有另一个描述不太一样的重复问题:javascript中this.formObj 传递不过去,变成了TypeError: this.formObj is undefined - SegmentFault
因为 JavaScript 和 Python 不一样。
当你调用函数
a.b()
时,在函数a.b
内this
指向a
。但是当你不直接这样调用时,比如var c = a.b; c()
,JavaScript 看到c
前边没有点,因此不会将它作为方法对待,this
未定义(严格模式)或者指向 global 对象(浏览器中是window
)。你应该使用
.bind
方法(其它语言中叫 curry、partial application)来处理方法作为值传递时带来的问题:var c = a.b.bind(a); c()
。即先绑定第一个参数(即this
)到对象本身,再传来传去。参见:JavaScript’s “this”: how it works, where it can trip you up。
PS: 相同的问题不要问多次。