Search

与我们合作

我们专注:网站策划设计、网络多媒体传播、网站优化及网站营销、品牌策略与设计
主营业务:网站建设、移动端微信小程序开发、VI设计、网络运营、云产品·运维解决方案

有一个品牌项目想和我们谈谈吗?

您可以填写右边的表格,让我们了解您的项目需求,这是一个良好的开始,我们将会尽快与您取得联系。当然也欢迎您给我们写信或是打电话,让我们听到您的声音

您也可通过下列途径与我们取得联系:

地 址: 深圳.龙岗区大运软件小镇11栋3楼

电 话: 138 2888 4598 / 138 0880 9053

网 址: http://www.appvx.cn

快速提交您的需求 ↓

JavaScript回调函数、作用域、变量提升

时间:2017-09-12 浏览:3532 编辑:深正互联 来源:互联网


今天,一个小伙伴遇到了问题:执行一个函数,说出最后这个函数的执行结果。代码如下:

(function(callback){

    president = {name:"bush"};

    callback(president);

    console.log(president.name);

})(function(a){

    a.name="obama";

    a = {name:"clinton"};

});


分析以上代码,可以得出以下结论:

1、第一个匿名函数定义的同时就执行,并且带有一个形参callback;

2、函数中定义了一个全局变量president,是一个json对象。

3、第二个匿名函数就是形参callback的实参;

4、第二个匿名函数中在执行的时候,它的参数又调用了第一个函数中的president。


为了方便理解,这个函数最后可以变形为:

(function(){

    president = {name:"bush"};

    function callback(){

        var a = president;

        a.name="obama";

        a = {name:"clinton"};

    }

    callback(president);

    console.log(president.name);//obama10

})();


其实,给一个函数传递实参,可以理解在在函数内部定义了一个局部变量,这个局部变量就是形参,它的值就是那个实参,就像以上代码var a = president一样。


那么打印president.name的时候,因为这个president所在作用域是外部函数的匿名函数,所以callback函数内部的变量是访问不到的,但是callback内部通过变量a可以访问到外部匿名函数的变量president,动态改变它的name值为obama,所以最后的打印结果是obama。


如果想要最后的打印结果是clinton,那么代码可以修改如下:

(function(){

    president = {name:"bush"};

    var a;

    function callback(){

        a = president;

        a.name="obama";

        a = {name:"clinton"};

    }

    callback(president);

    console.log(a.name);

})();

网站建设专家【深正互联】 TEL:13828884598 提供:深圳网站制作、企业高端网站建设,高端网页设计,定制开发网站,以及高端定制网站建设服务。深圳地区网站建设案例高达3000家,放心选择,值得信赖。是深圳地区优秀网络公司之一,网址www.szhulian.com 



本站文章均为深正网站建设摘自权威资料,书籍,或网络原创文章,如有版权纠纷或者违规问题,请即刻联系我们删除,我们欢迎您分享,引用和转载,但谢绝直接搬砖和抄袭!感谢...
GO 欣赏案例
查看经典案例
在线咨询
电话咨询
0755-36630177
返回顶部
在线咨询 获取报价 电话咨询
获取报价
您的称呼:

*

您的电话:

*

您的邮箱:

*

提交 重置
重要的事情,电话里聊

接通客服

不方便的时候线上咨询,在线等哦