以下这一段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
3 回答
江户川乱折腾
TA贡献1851条经验 获得超5个赞
因为 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: 相同的问题不要问多次。
长风秋雁
TA贡献1757条经验 获得超7个赞
添加回答
举报
0/150
提交
取消