以下这一段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
你这个应该是js的作用域的问题,js没有块级作用域,貌似在es6 use strict 模式下可以解决,但是浏览器尚未完全实现
因为 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: 相同的问题不要问多次。
回调函数,这个函数是执行在selectChange中的,当你在window下面执行selectChange,那么this指向的就是window,既然老爸指向的都是window,那么儿子指向的肯定就是window了,