星空网 > 软件开发 > Java

在jQuery.getData中renderCallback使用不同创建方式的结果

JavaScript 中需要创建函数的话,有两种方法:函数声明、函数表达式,各自写法如下:
// 方法一:函数声明
function foo() {}
// 方法二:函数表达式
var foo = function () {};
另外还有一种自执行函数表达式,主要用于创建一个新的作用域,在此作用域内声明的变量不会和其它作用域内的变量冲突或混淆,大多是以匿名函数方式存在,且立即自动执行:

(function () {// var x = ...})();

 

此种自执行函数表达式归类于以上两种方法的第二种,也算是函数表达式。



当我使用jQuery.getData时,代码如下:

$.getData("getDeptUsers/",jsonParam,null,getDepUseFn,"0");var getDepUseFn=function(ret){var data=ret.data;var empNum="共"+data.length+"人";$("#deptEmpNum").val(empNum);if(data.length>0){...}else{...}...}

此时控制台不报错,但getDepUseFn并不执行,js中加断点检查得知调用getDepUseFn时指向undefined;
尝试在作为参数引用时就调用$.getData("getDeptUsers/",jsonParam,null,getDepUseFn(),"0");则直接报错undefined;
再次尝试其他创建函数的方式:
function getDepUseFn(ret){};
之后函数被正常调用。



JavaScript 解释器中存在一种变量声明被提升(hoisting)的机制,也就是说变量(函数)的声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是会被提升至最前面。
因此推测在调用时,getDepUseFn已经被声明但未赋值,验证:

$.getData("getDeptUsers/",jsonParam,null,getDepUseFn,"0");console.log(getDepUseFn); //Line76var getDepUseFn=function(ret){var data=ret.data;var empNum="共"+data.length+"人";$("#deptEmpNum").val(empNum);if(data.length>0){...}else{...}...}console.log(getDepUseFn); //Line99

 

测试结果:
getCompanyDept.js:76 undefined
getCompanyDept.js:99 $.on.getDepUseFn(ret)
结论:
1、猜测使用函数表达式方式创建getData的参数函数时,由于js的声明提前机制,导致调用了未赋值函数。
2、可用函数声明的方式回避这个问题,也可以用直接将函数创建在getData之前的方式(推荐)来解决。




原标题:在jQuery.getData中renderCallback使用不同创建方式的结果

关键词:jquery

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

谷歌SEO做好了为什么可以压低谷歌广告成本?:https://www.kjdsnews.com/a/1353071.html
重磅!亚马逊终于开放数据,卖家:越来越卷了!:https://www.kjdsnews.com/a/1353072.html
7个高效投放谷歌广告的技巧:https://www.kjdsnews.com/a/1353073.html
重磅,亚马逊页面又有新变化!中小卖家的亚马逊之路更艰难了吗?:https://www.kjdsnews.com/a/1353074.html
德国亚马逊FBA头程怎么收费:https://www.kjdsnews.com/a/1353075.html
你一定要知道的WhatsApp国内使用方法:https://www.kjdsnews.com/a/1353076.html
加码韩国市场!亚马逊在韩推出免费送货服务:https://www.kjdsnews.com/a/1842204.html
沅陵县借母溪攻略 沅陵借母溪好玩吗:https://www.vstour.cn/a/409230.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流