对于JS语言的深刻理解(变量定义;作用域链;闭包;this)
2014-12-28 13:21
381 查看
好吧,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总是指向调用该方法的对象。
折腾了好长时间才有了些许眉目。
总体来看,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总是指向调用该方法的对象。
相关文章推荐
- js特殊例子--方法内重新定义了变量在后面就会前面的为undifined,后面没有定义就用全局的--各种专业文献上的“闭包”(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函
- 谈谈自己对js闭包,执行上下文,作用域链,活动对象AO,变量对象VO的理解
- Js闭包中变量理解
- js的变量和闭包的理解
- JS闭包之深刻理解
- 几句话带你理解JS中的this、闭包、原型链
- js中的预解析(变量提声)、作用域链、闭包机制
- Js函数深入理解-作用域链与闭包
- js 混杂点-变量定义与闭包
- 对于闭包的深刻理解
- Js函数深入理解-闭包中的this
- JS中变量定义、预解释和闭包(一)
- js闭包的理解以及闭包中this的理解
- 深刻理解js执行原理和闭包
- 理解js 的作用域链 原型链 闭包 词法分析
- js面向对象--理解闭包
- 理解Javascript_15_作用域分配与变量访问规则,再送个闭包
- 有关js的变量作用域和this指针的讨论
- js全局变量与局部变量 预解析与作用域链详解