Deep BlueVBScriptWMIPHPC语言JavaScriptWindows API路由器Windows函数Python

JavaScript中的闭包(closures)

今天有个不明真相的同学跟我说JavaScript很简单,我顿时感到压力很大。曾经我也是这么认为的,直到有一天无意中看了一下JQuery的源码,才发现我根本不懂JavaScript。正如《说说掌握JavaScript语言的思想前提》里所说:

大部分人对JavaScript的高级应用不甚了解,已有的知识架构里会认为JavaScript仅仅是一门脚本语言,其作用是给页面做一些锦上添花的效果,比如表单验证等等。潜意识里也就不会用面向对象的思想去编写JavaScript代码,也很少会去深入了解prototype, context, scope chains, closures等概念。

任何一门语言,无论它多么简单,都不是一天两天就能掌握的,无论是VBScript,还是JavaScript,抑或是其他。才学了几天就说JavaScript很简单,这只能显得你很肤浅。懂得基本的语法,并不等于懂得这门语言。

《JavaScript The Definitive Guide, 5th Edition》里有段话:

Closures are an interesting and powerful technique. Although they are not commonly used in day-to-day JavaScript programming, it is still worth working to understand them. If you understand closures, you understand the scope chain and function call objects, and can truly call yourself an advanced JavaScript programmer.

闭包是一种有趣而强大的技术。虽然它们在日常的JavaScript编程中不经常使用,但是依然值得你去了解它们。如果你理解了闭包、作用域链和函数的call对象,那么你就可以真正自称为高级JavaScript程序员了。

书上举的闭包的一个简单例子:

uniqueID = (function() {
    var id = 0;
    return function() { return id++; };
})();

《学习Javascript闭包(Closure)》最后给了道思考题:

var name = "The Window";

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

WScript.Echo(object.getNameFunc()());
var name = "The Window";

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

WScript.Echo(object.getNameFunc()()); 

纠结了半天总算弄懂了。


http://ken.gw.to/