什么是JS的执行上下文?
概念
当函数执行时,会创建一个称为执行上下文的内部对象(可理解为作用域)。一个执行上下文定义了一个函数执行时的环境。
执行上下文也叫执行环境
Javascript中代码的运行环境分为以下三种:
1. 全局级别的代码 - 这个是默认的代码运行环境,一旦代码被载入,引擎最先进入的就是这个环境。
全局:变量定义,函数声明
2.函数级别的代码 - 当执行一个函数时,运行函数体中的代码。
我们现在已经知道,每当调用一个函数时,一个新的执行上下文就会被创建出来。
函数在执行之前(发生在当调用一个函数时,但是在执行函数体内的具体代码以前)会建立变量,函数,arguments对象,参数,确定this的值,建立作用域链
1.函数声明
函数声明以function关键字开头,接着是必须的函数(变量)名和以逗号分隔的可选的参数列表,再接着就是以大括号封装的函数体。函数声明必须是一个单独的JavaScript语句。
2.函数表达式
在任何情况下都是其它JavaScript语句的一部分(比如赋值表达式等号的右侧、函数的参数)的函数被称为函数表达式。
函数声明可以提前被调用(堆内存),函数表达式不可被提前调用(栈内存)
不同执行上下文之间的变量命名冲突通过作用域链解决,从局部直到全局。这意味着具有相同名称的局部变量在作用域链中有更高的优先级。
什么是闭包
《JavaScript高级程序设计》这样描述:
最常见的闭包结构如下
function aaa(){ var name = "xxx" return function bbb(){ alert(name); } }
如上代码,bbb函数内可以访问aaa函数作用域内的变量
闭包的特性
1. 可以读取函数内部的变量
2. 让这些变量的值始终保持在内存中。不会在函数调用后被清除
闭包的缺点
1. 由于闭包会是的函数中的变量都被保存到内存中,滥用闭包很容易造成内存消耗过大,导致网页性能问题。解决方法是在退出函数之前,将不再使用的局部变量全部删除。
2. 闭包可以使得函数内部的值可以在函数外部进行修改。所有,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接