javascript 的 callback 是否有问题,会导致对象无法传递

以下这一段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

阅读 5.5k
3 个回答

因为 JavaScript 和 Python 不一样。

当你调用函数 a.b() 时,在函数 a.bthis 指向 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了,

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏