目录
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
JavaScript 中存在两种作用域:全局作用域和函数作用域,不存在块级作用域。全局作用域在浏览器中是window对象。
执行环境(execution context)是JavaScript 中最为重要的一个概念,定义了变量和函数访问其它数据的权力。
全局作用域:
最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的。
局部作用域:
和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的。
像在C/C++中,花括号内中的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的,但是javascript不同,并没有所谓的块级作用域,javascript的作用域是相对函数而言的。
js为每一个执行环境关联了一个变量对象。环境中定义的所有变量和函数都保存在这个对象中。
全局执行环境是最外围的执行环境,全局执行环境被认为是window对象,因此所有的全局变量和函数都作为window对象的属性和方法创建的。
js的执行顺序是根据函数的调用来决定的,当一个函数被调用时,该函数环境的变量对象就被压入一个环境栈中。而在函数执行之后,栈将该函数的变量对象弹出,把控制权交给之前的执行环境变量对象。
JS中作用域有:全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称ES6)中新增了块级作用域。 块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。
1 非严格模式下不声明直接使用变量,变量会成为全局变量
2 和作用域对应的全局变量和局部变量(函数内变量)
作用域链
执行环境会创建变量对象的作用域链。
作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。
作用域链的前端始终是当前执行代码所在环境的变量对象。全局执行环境的变量对象始终是作用域链中最后一个对象。
这有两方面的影响:1 变量只能沿着自身所在的作用域链查找,直到找到为止,否则返回错误;2 隔离其它变量。
简化来说:就是一个调用变量形成的查找过程;把它再和执行环境结合起来包装形成作用域链。
延长作用域链
try - catch 语句的 catch 块 with 语句 在作用域链前端临时增加一个变量对象,该对象会在代码执行之后移除
this 关键字是 JavaScript 中最复杂的机制之一。它是一个很特别的关键字,被自动定义在 所有函数的作用域中。
this 对象是在运行时基于函数执行环境绑定的。
《javascript高级程序设计》一书给出的解释是:
this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象调用时,this等于那个对象。不过,匿名函数具有全局性,因此this对象同常指向window
感谢大家观看
By 李榕涛