总结下js的加载到执行,浏览器都做了什么,如何形成js函数作用域链。
看下面的代码:
<script> function addEvents(){ var id = “form1”; document.getElementById(“save_button”).onclick = function(event){ sumitForm(id); }; } </script>
函数加载到页面,浏览器开始解释
add函数被创建,浏览器将add可访问的作用域的对象放入add的[[scope]]①属性中,供函数执行时候用。
addEvent ();
函数执行时候,浏览器会做一些准备
1、 浏览器会创建一个运行期上下文(类似编译原理所说的运行栈),用于定义函数执行时的环境,当函数执行完毕就会删除。
2、 浏览器将addEvent的scope属性复制到上下文的作用域链scope chain中。
3、 浏览器根据addEvent创建一个活动对象,该对象类似map键值对,包含了addEvent函数的局部变量,并将活动对象放入作用链数组的最顶层。
如图:
这里可以看到很多东西,例如
1、访问局部变量比全局变量速度快。
2、因为局部变量在作用域链的顶端,在函数中将频繁使用的全局变量赋值给局部变量,可提供程序执行的时 间。
3、With语句改变作用域链,是将一个对象放入作用域链的最顶端,这样访问with语句的对象很快,但是访问局部变量就慢了一个级了。不推荐使用with语句,因为可以将对象赋值给局部变量,访问速度也很快,节省了改变作用域链的消耗。
4、With、eval、catch子句,他们都可以改变作用域链,令到一些对访问变量进行优化的引擎没法正常优化 ,因为可以将对象赋值给局部变量,访问速度也很快,节省了改变作用域链的消耗。
(待续 下篇 闭包作用域链)
相关推荐
本文实例分析了JavaScript函数作用域链。分享给大家供大家参考。具体分析如下: 作用域链: JavaScript的每个函数function都有自己的作用域,使用Active Object(简称AO)活动对象来保存,在相互嵌套的函数中形成了...
目录 JS三座大山同步异步同步异步区别作用域、闭包函数作用域链块作用域闭包闭包解决用var导致下标错误的问题投票机闭包两个面试题原型、原型链原型对象原型链完整原型链图 JS三座大山 同步异步同步异步区别...
javascript中没有块级作用域,取而代之的javascript使用的是函数作用域,下面使用示例学习一下js作用域的使用方法
认识函数作用域 作用域的分类 JavaScript 认识函数作用域 思考:声明变量后就可以在任意位置使用该变量嘛? 回答:不是。 举例:函数内var关键字声明的变量,不能在函数外访问。 示例 1.作用域分类 认识函数作用域 ...
NULL 博文链接:https://xieyaxiong.iteye.com/blog/1558277
在ES6之前,javascript只有全局作用域和函数作用域。所谓作用域就是一个变量定义并能够被访问到的范围。也就是说如果一个变量定义在全局(window)上,那么在任何地方都能访问到这个变量,如果这个变量定义在函数...
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。任何程序...
// 局部变量:在函数作用域之间里的一个或者多个函数或者作用域,在局部作用域中定义的变量 局部变量。只有在该作用域内可以访问 // 局部作用域:任何一个函数的内部都有一个局部作用域,在局部作用域中定义的...
前端面试题,包含JavaScript的闭包,作用域,原型,原型链,上下文环境以及DOM,BOM封装函数深度克隆,以及一些常见的·JS问题,试题简单但是容易混淆,作为前端工程师必考题
JavaScript 作用域 和作用域链作用域作用域链 作用域 作用域就是变量与函数的可访问范围,作用域控制着变量与函数的可见性和生命周期。换句话说,作用域决定了代码区块中变量和其他资源的可见性。 function fun() { ...
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。 ...
javascript中没有块级作用域。取而代之的javascript使用的是函数作用域(function scope):变量在声明它的函数体以及这个函数体嵌套的任意函数体内都是有定义的。
嵌套的函数(作用域链) 当你进行函数的嵌套时,要注意实际上作用域链是发生变化的,这点可能看起来不太直观。你可把下面的代码置入firebug监视值的变化。 代码如下: var testvar = ‘window属性’; var o1 = {test...
工作这几年,js学的不是很好,正好周末...当然是函数作用域了,我们的浏览器就是一个被实例化的window对象,如果在window下定义一个name字段,那么name字段就具有window这个函数作用域,也就是在window下都是可以访问
虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获! 作用域(Scope) 1. 什么是作用域 作用域是在运行时代码中的某些特定部分中...