javascript 的 callback 是否有问题,会导致对象无法传递
高洛峰
高洛峰 2017-04-10 14:30:55
[JavaScript讨论组]

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(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: 相同的问题不要问多次。

PHPz

你这个应该是js的作用域的问题,js没有块级作用域,貌似在es6 use strict 模式下可以解决,但是浏览器尚未完全实现

迷茫

回调函数,这个函数是执行在selectChange中的,当你在window下面执行selectChange,那么this指向的就是window,既然老爸指向的都是window,那么儿子指向的肯定就是window了,

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号