JS比较3种函数的作用域

在《JS函数定义》一节中,我们讲到了 3 种创建函数的方法,分别是:使用 function 语句、使用 function 表达式和使用 Function  构造函数。

下面分别使用这 3 种方法定义一个空函数:

function f() {}
var f = function () {}
var f = new Function()

通过这 3 种方法创建的函数对象的 [[scope]] 属性值会有所不同,进而影响函数执行过程中的作用域链。

  • 使用 function 语句的函数对象是在进入执行上下文时的变量初始化过程中创建的。该对象的 [[scope]] 属性是它被创建时的执行上下文对应的作用域链。
  • 使用 function 表达式定义的函数对象是在该表达式被执行的时候创建的的。该对象的 [[scope]] 属性值与使用 function 声明创建的对象一样。
  • 使用 Function 构造器声明一个函数通常使用两种方式。常用格式是 var funcName = new Function(p1,p2,…,pn,body),其中 p1,p2,…,pn 表示的是该 function 的形式参数,body 是 function 的内容。使用该方式的 function 对象是在构造器被调用的时候创建的。该对象的 [[scope]] 属性值总是一个只包含全局对象的作用域链。

这 3 中方法的详细比较如表所示。

函数定义方法比较
函数定义方法 使用 function 语句 使用 Function() 构造函数 使用函数表达式
兼容 完全 JavaScript 1.1 及以上 JavaScript 1.2 及以上
形式 句子 表达式 表达式
名称 有名 匿名 匿名
主体 标准语法 字符串 标准语法
性质 静态 动态 静态
解析 以命令的形式构造一个函数 解析函数体,能够动态创建一个新的函数对象 以表达式的形式构造一个函数对象
作用域 具有函数作用域 顶级函数,具有顶级作用域 具有函数作用域

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/23142.html

(0)
上一篇 2021年7月20日
下一篇 2021年7月20日

相关推荐

发表回复

登录后才能评论