一点读书笔记
JS函数知多少(上)
说起来JavaScript
中最有意思的东西,莫过于函数了。
函数在任何一种编程语言中应该都存在,可以将经常使用的代码封装起来,在需要的地方多次调用。在JavaScript
中也是这个意思,不过它还有他自己独特的地方。
Function
作为一种引用类型,每个函数都是Function
类型的实例,定义:
function functionName (argnments) {
// something...
};
你也可以使用函数表达式:
let fun = function (argument) {
// something...
};
使用这种方式的时候不用写函数名,使用fun
即可引用。这两种方式几乎相差无几。
它具有引用类型的属性与方法。所以本质上函数是对象。你可能没见过这样的操作:
let addNum = new Function('num1', 'num2', 'return num1+num2');
上面这个实际上是定义了一个函数,接受两个参数,返回两个数字的和。很形象的表现了对象的本质,但是实际使用的时候不推荐这样写。
因为是以对象为形式在内存中存储的,所以函数的名字本质上只是一个指向函数的指针,这样的话一个函数也可以有多个名字了,只是多个指针引用了同一个对象。我们也可以通过给某个名字赋值null
来解除这种引用。这种特性引出了JS
函数的一个特点:没有重载
。因为当你创建第二个相同名字的函数的时候就把第一个引用给覆盖掉了。
函数是可以作为值来引用的,你可以给函数传递参数的时候传递一个函数,你也可以在返回值的时候返回一个函数,这在某些场景下是十分有用的。
在函数中有两个属性需要注意下:
arguments
它是一个跟数组差不多的对象,保存着传进函数的所有参数,我们可以很方便的查看,进行一些操作。比如根据传入参数的情况判断对应的操作。
this
当初设计js
的时候被迫进行模仿Java
,所以这个特性跟Java
中的类似。this
引用的是函数执行的环境对象。这个要看具体的情况具体分析。比如当在网页的全局环境下调用函数的话,this
对象引用的就是window
。它可以在代码的执行过程中引用不同的对象。
不过还需要注意一个特殊的类别:箭头函数。箭头函数是没有this
的,它的这个属性只取决于包裹箭头函数的第一个普通函数的this
。
下一篇从作用域角度再详细说明。