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

收到一只叮咚
浏览 482回答 3
3回答

江户川乱折腾

因为 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了,
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript