您现在的位置:首页 > 技术 > JavaScript知识笔记7:函数(上)

JavaScript知识笔记7:函数(上)

JavaScript是第一个成为主流的Lambda语言。JS被定义为一种Lambda语言,主要是JS应用编程时函数式编程。Lambda算法是一套用于研究函数定义、函数应用和递归的形式系统。

2016年07月

透明伽然

JavaScript函数主要基于词法作用域的顶级对象。此之前我们强调过JS函数作用域是在函数定义时决定的,而不是在调用时决定,因为词法作用域是一种静态作用域。

有学者这样描述:JavaScript是第一个成为主流的Lambda语言。JS被定义为一种Lambda语言,主要是JS应用编程时函数式编程。Lambda算法是一套用于研究函数定义、函数应用和递归的形式系统。

1.  定义。

1) 使用function语句定义,这是最常见的一种写法

2) 通过Function()构造函数定义

function_body 是函数体,也就是函数要执行的语句。

3) 在表达式中定义函数,这更好地体现了JS的灵活性

通过var变量来接收保存一个函数对象,这也充分体现了JavaScript是一门弱类型语言,只在赋值时才能确定变量的类型。

以上三种方式的区别:

a.  通过Function()构造函数可以动态定义和编译函数,而使用function语句定义和表达式中定义只能预编译函数。通常需要一个会被多次调用的函数选择使用function语句来定义该函数,这样可以避免每次调用都会解析和编译。

b.  使用function语句定义需要使用{}写成语句块,但是通过Function()构造函数定义时,可以将函数写成表达式。

c.  只有function语句不可以在一个表达式中定义函数,其他两种方法都可以。

2、 我们知道JS中可以说“万物皆对象”,函数也不例外。通常我们理解的对象都是可以看得见的,或者说是已经在内存中分配了一定空间的一个虚拟个体,而函数往往是被当作一个接口被理解。

对象是可以看作是“键值对”集合,JS对象也是如此,并拥有一个连到原型对象的隐性链接。字面量产生的对象都连接到Object.prototype,函数对象是连接到

Function.prototype,而函数的原想对象本身是连接到Object.prototype

其实也不难理解,根据JavaScript的弱类型语言也能浅显地理解它:变量可以接收一个表达式的赋值的方式来创建一个函数,表达式隐性地被作为了一个对象被传递,那么函数自然就自动转换为对象类型。

利用浏览器的Watch工具监听一个函数,可以很清晰地获取我们想要的结果:

arguments是函数的参数对象,这里为null,只有在函数调用时才有作用。

caller返回一个调用当前函数的引用,只有在执行时才有定义。

length函数定义时,定义参数的个数

prototype函数内置的属性,指针对象,指向原型对象,之前专门描述过。函数在创建时,随着赋予一个prototype属性,它的值是一个拥有constructor属性且值即为该函数的对象。

原型对象同样用一个__proto__原型链属性,如图:Object{}

__proto__内置属性,函数构建被赋予,寻找原型链的属性,如图:function(){}

2.  函数通常是由5个部分组成。

1) function 关键字,标识了该对象是一个特殊数据类型function而不是object

2) 函数名,通常一些会被多次调用的函数在定义时,必须给定函数名。函数名通常是小写字母开头,采用“驼峰命名法”命名。

3) 参数。参数并不是必须的。实际上,在JS函数定义时并不需要对参数规定类型,调用时也不需要对传入参数进行类型检查,更自由的是在调用时甚至是不用检查参数个数。正因为JS有这样的特性,在实际编程会给我们带来不少麻烦,如果我们想将JS编程代码做到更严谨高效的话,那么在函数定义者部分我们就要掌握下面提及的方法。

我们会用到arguments,这是JavaScript函数内部的一个特殊对象,是一个类数组对象,用于保存所有传入函数的参数。函数可以通过它来访问所有调用时传递过来的参数列表,也使得JS函数参数拥有了以上的不确定性。

a.  判断参数个数

输出结果:

arguments.callee 通常使用在匿名函数中,calleearguments的一个属性,指向这个arguments对象的函数。这里可能会混淆的是this,起初我也是认为回去当前函数参数个数可以写作:this.length。但是在函数内部,this指向的函数执行的环境对象,而不是函数本身。

b.  判断参数类型

这里也可以直接用参数变量名进行判断,typeof语法中括号是可选项。typeofstringnumberfunctionundefinedboolean等几种类型判断完全可以,但是很多情况我们会将一个数组或者一个自定义对象实例作为一个参数来传递,则需要以下方式处理:

instanceof操作符之前提及过,可以判断变量是否是对象的一个实例,对于JS内置对象和自定义对象都适用。

这是网上找到的针对跨frame对象构建的数组检测实现方式

c.  给参数默认值

在实际编程过程中调用函数时,可能参数值并不是我们想要的,值在Boolean环境下为false,就需要为其设置默认值。但是Number类型参数需要注意0Boolean环境下返回值是false

上述例子中我们使用”||”操作符代替了if判断,但是这前提是变量必须预先声明,否则就会报引用错误“name is undefined”,实例中“name”被作为定义参数传入,相当于var

null被作为参数传入,这样的做法经常在特殊情况下被主动用作参数占位符,当然也可以使用undefined

4) 函数体,包括在{}内的一组逻辑嵌套语句,这些语句是函数的主体,在函数被调用时执行。良好的变成习惯是一个函数仅仅只做一件事情,所以出现在一个函数体内的逻辑仅仅只是围绕以个方向的逻辑展开的,不要企图在意个函数内做很多事,那么只会让代码更繁琐,变得没有条理。

  5)返回值。JS函数在创建时,并不需要声明返回值,默认都返回undefined。返回值类型在return之后确定,return在函数体内的作用是提前终止函数运行并输出相应的表达式或值,可以出现在函数体任何位置。


订阅

欢迎订阅AnyForWeb出版物
欢迎订阅伽然出版物

栏目推荐

栏目推荐
JavaScript知识笔记9…

在jQuery源码中我们经常能看见各式各样…

栏目推荐
JavaScript知识笔记8…

函数的调用应该才是函数产生的根本,减…

栏目推荐
JavaScript知识笔记6…

在JS中使用操作符主要用来执行数学、相…

栏目推荐
JavaScript知识笔记5…

周知JS语法相对简单,语言结构简单,这…

栏目推荐
JavaScript知识笔记4…

JS相对于那些所谓重量级语言(C++、C#…

栏目推荐
JavaScript知识笔记3…

Javascript中this是一个指针概念,它表…

栏目推荐
JavaScript知识笔记2…

常见的变成语言Java、C#、C++等,同样…

AnyFroWebUED  

版权所有 © 2009-2016  沪ICP备14026814号-10

 

 

返回

很抱歉!

您现在还没有开通阅读权限,如有疑问,请联系我们。

联系电话:021-52047186

返回