对于JS语言的深刻理解(变量定义;作用域链;闭包;this)

好吧,js很任性,尼桑表示很无奈。

折腾了好长时间才有了些许眉目。

总体来看,js有两大特点:首先它是键值对语言;其次它是递归语言。

第一来谈谈变量定义问题

js有全局变量和局部变量两种说法。但是从广义来看我认为js只有局部变量。(这里要把不带var的变量定义去掉)

为什么这么说捏?因为这样从js寻找变量的方式来说了。js寻找变量的方式是从内到外的,js引擎寻找变量的时候,会首先从包含这个变量定义的对象(函数)去寻找,如果能找到就结束,如果找不到,再从包含这个对象(函数)的外部对象(函数)继续寻找。一直到最外部的Window对象。所以Window对象内部和Window内部对象(函数)作用域之间的范围定义一个变量。而Window包含的所有内部对象(函数)木有定义这个变量。那么这个window定义的变量相对window对象(函数)就是全局变量。所以从广义来看,js只有局部变量。这里有一种特殊例子除外。不带var定义的变量是全局变量。

第二来谈谈作用域链。

其实js这样查找变量是基于作用域链的机制来实现的。每个js对象都有一个作用域链。这个作用域链包括js对象在其内部定义的每一个局部变量。js引擎每当碰到一个变量,都会从包含其变量的对象的作用域链来查找。如果找不到再从外部来寻找。就这样递归性的查找。

第三来谈谈闭包。

闭包的定义我是这样翻译的:内部函数有包含其外部函数的引用。因为js所有东西都是对象。函数也是对象。

这个定义其实木有什么实际意义的。就是这样的定义。下面来看看js是如何形成闭包的。当一个函数执行完的时候。js引擎是会把这个函数内部的所有变量都释放的。但是如果其内部函数还木有执行完,而且其内部函数还有对包含其外部函数变量的引用。那么这个变量,js引擎表示很无奈,不能释放。所以这个变量就留在了内存中。这个时候闭包就形成了。ok闭包的概念讲清了。而且闭包是基于作用域链的。理解了作用域链,就理解了闭包。

第三来谈谈this

this这个东西真滴很灵活捏。不过真滴有点眉目了。想要知道this指代滴到底是什么东西,那就要 分析你滴环境对象到底是谁,环境对象是谁,this就是谁。

this总是指向调用该方法的对象。

阅读更多
换一批

没有更多推荐了,返回首页