亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 508 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號