了解Javascript_15_作用域赋值和变量访问规则 然后发送闭包
范围分配和变量访问规则在ECMAScript中,函数也是对象。函数是在变量实例化过程中,或者在计算函数表达式或调用函数构造函数时,根据函数声明创建的。(有关“函数对象”,请参见《理解Javascript_08_函数对象》)。每个函数对象都有一个内部[[作用域]]属性,该属性也由一个对象列表(链)组成。这个内部[[作用域]]属性是指它们的执行环境的作用域链,当前执行环境的活动对象被添加到对象列表的顶部。当我们访问函数内部的变量时,实际上是在作用域链上寻找变量的过程。理论太强了(把我总结死了!),我们来看一段代码:复制代码如下: script type=' text/JavaScript ' function outer(){ var I=10;函数inner(){ var j=100;警报(j);//100警报(I);//10警报(ADF);} inner();} outer();/script下图清晰显示了上述代码的内存分配和范围分配。
下面我们来解释一下:1。加载代码并创建一个全局执行环境。此时,外部变量将被添加到指向函数对象外部的变量对象(窗口)中。此时,范围链中只有窗口对象。2.执行代码。当程序执行到outer()时,它将在全局对象中查找外部变量并成功调用它。3.创建外部的执行环境。这时候会创建一个新的活动对象,变量I会加上一个值10,变量inner会加上指向函数对象inner。活动对象将被压入范围链,函数对象outer的[[scope]]属性将指向活动对象outer。此时,作用域链执行window.4的代码,window . 4是outer的活动对象,并成功地为I赋值.当程序执行到inner()时,它会在函数对象outer的[[scope]]中寻找内部变量。找到后成功调用。5.创建inner的执行环境,新建一个活动对象,添加变量j,赋值100,按活动对象进入作用域链,函数对象inner的[[scope]]属性指向活动对象inner。此时,范围链是:inner之外的活动对象的全局对象。6.执行代码为j赋值,当访问I和j时,在作用域和输出中成功找到对应的值。注意:通过内存图,我们可以发现范围链和原型链是如此相似。这说明了很多问题.(仁者见仁智者见智,自己去找答案吧!)闭包原理我们理解了范围的问题之后,闭包的问题就已经很简单了。什么是结束?闭包是一个内部函数,它关闭外部函数范围内的变量。我们来看一个典型的闭包应用程序:生成增量值,复制代码如下:脚本类型=' text/JavaScript ' var increment=(function(){ var id=0;return函数(){ return id} })()alert(increment());//1 alert(increment());//2/脚本外部匿名函数返回一个嵌入函数,嵌入函数使用外部匿名函数的局部变量id。可以合理的说,外层匿名函数的局部变量在返回时超出了作用域,所以不能使用increment()调用。这就是Closure,即函数调用返回一个嵌入函数,嵌入函数指的是应该Close的资源,比如局部变量和外部函数的参数。这是怎么回事?我们来找答案:。
根据作用域链的理解,返回的嵌入函数在构造时已经持有作用域链。虽然outer的返回会导致这些对象超出范围和生存期范围,但JavaScript使用自动垃圾收集来释放对象内存。按照规则定期检查后,这些物件会在没有任何参考的情况下被释放。因此,上述代码可以正确运行。参考资料:http://www . cn blogs.com/Riccc/archive/2008/02/15/JavaScript-对象-模型-执行-模型. html http://www . cn-杜鹃.com/2007/08/01/了解-JavaScript-闭包。
版权声明:了解Javascript_15_作用域赋值和变量访问规则 然后发送闭包是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。