函数的定义,作用域,递归,解析与this 关键字

函数的定义,作用域,递归,解析与this 关键字

Created
Apr 21, 2022 04:12 PM
Tags
JavaScript
Property

定义

在 JavaScript 中有多种方法定义一个函数,如下:
函数声明
function myFunction(param1,param2){ return param1 + param2; } let plus = myFunction(1, 3);
若不设置返回值则默认返回 undefined
函数赋值表达式
在 JavaScript 中函数也是一种对象,所以还可以将函数赋值给变量
var myFunction = function(param1,param2){ return param1 + param2; } let plus = myFunction(1, 3);
这种方法定义的函数是匿名的,但可以通过被赋值给的变量来调用,此方法还可简化为:
const myFunction = (param1,param2) => param1 + param2;
new Function
该函数是通过运行时通过参数传递过来的字符串创建的,它允许我们将任意字符串变为函数
let func = new Function ([arg1, arg2, ...argN], functionBody);

作用域

在函数内定义的变量不能在函数之外的任何地方访问,因为变量仅仅在该函数的域的内部有定义。相对应的,一个函数可以访问定义在其范围内的任何变量和函数。换言之,定义在全局域中的函数可以访问所有定义在全局域中的变量。在一个函数中定义的子函数也可以访问在其父函数中定义的所有变量和父函数有权访问的任何其他变量。

递归

递归是函数调用自身的操作,如下
function multiply(arr, n) { if (n <= 0) { return 1; } else { return multiply(arr, n - 1) * arr[n - 1]; } }

函数的解析

使用声明方式定义的函数会在执行前被解析,因此它在当前上下文的任意一个地方被调用都是可以正常运行的。
myFunction; // 正常运行 function myFunction() {}
但是使用赋值表达式定义的函数并不会提前解析,因此并不能在函数定义前调用函数
myFunction; // 'undefined' myFunction(); // 出错:TypeError var myFunction = function() {};
在此例中,对变量的解析是在代码运行之前进行的(关于变量的声明见var, let, const 的区别 (zengkangfu.com)),因此 myFunction 为 undefined,而在调用 myFunction() 时函数仍未被解析,因此运行出错。
同一个函数名被声明多次,则函数经解析后会以最后一次的定义为准。

this关键字

this 指的是函数运行时所在的环境,如下例:
var obj = { foo: function () { console.log(this.bar) }, bar: 1 }; var foo = obj.foo; var bar = 2; obj.foo() // 1 foo() // 2
obj.foo() 中 foo 函数运行在 obj 环境中,此环境中 bar 的值为 1,而 foo() 运行在全局环境下,全局环境中 bar 的值为2,故出现了同样调用 foo() 结果不同的情况。