javascript - js闭包的一个小例子,没看懂,哪位大神帮我看看谢谢啦?
巴扎黑
巴扎黑 2017-04-11 11:16:26
[JavaScript讨论组]

1.为什么运行的最终结果是The Window,而不是My Object?
2.为什么alert(object.getNameFunc()())要在getNameFunc后面写两个()括号?每个括号代表什么意思?

代码如下:

var name = "The Window";   
var object = {   
    name : "My Object",   
    getNameFunc : function(){
        return function(){
            return this.name;
        };
    }
};   
巴扎黑
巴扎黑

全部回复(4)
巴扎黑

当一个东西很复杂的时候,你可以把它分解开分析:

alert(object.getNameFunc()())

等价于:

var fn = object.getNameFunc();
alert(fn());

这样是不是就清晰了,第一次调用返回的就是最内部的那个函数,记为fn。第二次调用就是在调用这个fn。

至于为什么得到那个结果,你需要理解的知识点是:函数中this的确定问题。请参考我专栏中关于this的那篇文章,或者网上搜一下有很多此类文章。

巴扎黑

getNameFunc返回的是一个方法体,所以你需要2个()进行连续调用
此时这个函数就是一个全局函数内部this指向windows所以返回的是The window

PHP中文网

因为getNameFunc这个函数的返回的另一个匿名函数,所以需要两个()才能执行匿名函数里的this.name,而结果是The Window是因为匿名函数函数调用的时候,函数内的this指向window

大家讲道理

return 出来的是一个暴露在全局变量下的函数,this对象已经指向了全局,所以如果你想达到你的目的,可以这样写:
bi bao

var name = "The Window";   
var object = {   
    name : "My Object",   
    getNameFunc : function(){
            var a = this.name;
            return function (){
                return a;
            }
    }
};

var name = "The Window";   
var object = {   
    name : "My Object",   
    getNameFunc : function(){
            var a = this;
            return function (){
                return a.name;
            }
    }
};
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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