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