函数作用域

函数声明和函数表达式有什么区别

  • 函数声明可以像变量声明前置一样,所以在作用域上下任何地方可以调用。
  • 函数表达式只能在赋值后调用

什么是变量的声明前置?什么是函数的声明前置

  • JavaScript解析器先解析所有变量的声明,提升到各自作用域的顶端,再运行代码
  • 函数声明提前类似于变量声明提前
  • 顺序为 变量 -> 函数 -> 参数
函数作用域_第1张图片
声明提前.png

arguments 是什么

  • 一组类数组形式的参数对象
函数作用域_第2张图片
arguments.png

函数的重载怎样实现

  • 在JavaScript中可以传入不同组别的参数来实现函数重载
函数作用域_第3张图片
重载.png

立即执行函数表达式是什么?有什么作用

  • 用()运算符
    1. (function(){}());
    2. (function(){})();
  • 一是不必为函数命名,避免了污染全局变量;
  • 二是IIFE内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。

什么是函数的作用域链

  • 函数对象的一个内部属性[scope]包含了函数被创建时的作用域中对象的集合,这个集合被称为函数的作用域链。
    1. 函数创建时,它的作用域链中会填入一个全局对象,该全局对象包含了所有全局变量。
    2. 函数执行时会创建一个称为“运行期上下文(execution context)”的内部对象,运行期上下文定义了函数执行时的环境。每个运行期上下文都有自己的作用域链,用于标识符解析,当运行期上下文被创建时,而它的作用域链初始化为当前运行函数的[[Scope]]所包含的对象。
    3. 这些值按照它们出现在函数中的顺序被复制到运行期上下文的作用域链中。它们共同组成了一个新的对象,叫“活动对象(activation object)”,该对象包含了函数的所有局部变量、命名参数、参数集合以及this,然后此对象会被推入作用域链的前端。
    4. 当运行期上下文被销毁,活动对象也随之销毁。
      在函数执行过程中,每遇到一个变量,都会经历一次标识符解析过程以决定从哪里获取和存储数据。该过程从作用域链头部,也就是从活动对象开始搜索,查找同名的标识符,如果找到了就使用这个标识符对应的变量,如果没找到继续搜索作用域链中的下一个对象,如果搜索完所有对象都未找到,则认为该标识符未定义。函数执行过程中,每个标识符都要经历这样的搜索过程。
函数作用域_第4张图片
![作用域链1.png](http://upload-images.jianshu.io/upload_images/37775-287f7169acad343d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

代码

以下代码输出什么?

函数作用域_第5张图片
代码1.png

写一个函数,返回参数的平方和?

函数作用域_第6张图片
代码2.png

如下代码的输出?为什么

函数作用域_第7张图片
代码3.png

如下代码的输出?为什么

函数作用域_第8张图片
代码4.png

如下代码的输出?为什么

函数作用域_第9张图片
代码5.png

如下代码的输出?为什么

函数作用域_第10张图片
代码6.png

如下代码的输出?为什么

函数作用域_第11张图片
代码7.png

如下代码的输出?为什么

函数作用域_第12张图片
代码8.png

如下代码的输出?为什么

函数作用域_第13张图片
代码9.png

如下代码的输出?为什么

函数作用域_第14张图片
代码10.png

你可能感兴趣的:(函数作用域)