为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

收到一只叮咚 2019-03-21 18:15:16
以下这一段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: 相同的问题不要问多次


查看完整回答
反对 回复 2019-04-13
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

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


查看完整回答
反对 回复 2019-04-13
?
长风秋雁

TA贡献1757条经验 获得超7个赞

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


查看完整回答
反对 回复 2019-04-13
  • 3 回答
  • 0 关注
  • 481 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信