Javascript学习5 - 函数
在Javascript中,函数和对象是交织在一起的。有些函数的特性与对象相关联。这一点的内容在第六部分会讨论到。
这一部分主要讨论函数与其它比较熟悉的语言(如C/C++)不同的地方
5.1 函数定义
function 函数名(参数1,参数2...)
{
主体;
}
函数内可以有return,也可以没有return. 没有return时,函数返回undefined值。
另外,Javascript是类型宽松的语言,所以,对于函数调用时传递参数,有以下特性:
① Javascript不会检测传递的数据是不是函数要求的类型。
如果参数的数据类型很重要,可以在函数内用typeof运算符进行检测
② Javascript不会检测传递给它的参数是否正确。
如果传递的参数比需求的个数多,多余的值被忽略。
如果传递的参数比需求的个数少,所忽略的几个参数被赋于undefined值
③ 函数内部有个Arguments对象维护着实际传递给函数的参数。
用它可以实现得到实际传递给函数的参数个数,及参数值。用于实现可变参数函数。
5.2 嵌套函数
实现如下:
function hypotenuse(a, b) { function square(x) { return x*x; } return Math.sqrt(square(a) + square(b));}
5.3 函数参数
● 可选参数
因为不会检测传递给它的参数是否正确,所以,可以忽略到相应的参数来达到可选参数的目的。
function copyPropertyNamesToArray(o, /**//* optional */ a) { if (!a) a = []; // If undefined or null, use a blank array // 以上语句也可以这样写 a = a || []; for(var property in o) a.push(property); return a;}
● 可变参数
在一个函数体内,标识符arguments具有特殊含义。它是引用arguments对象的一个特殊属性。
其类似一个数组的对象,可以按照数目获取传递给函数的参数值。
arguments具有length属性,可以获得实际传递给函数的参数个数
取得第一个参数值,可以使用argments[0]来获得。
1function max(/**//* */) 2{ 3 var m = Number.NEGATIVE_INFINITY; 4 // Loop through all the arguments, looking for, and 5 // remembering, the biggest 6 for(var i = ; i < arguments.length; i++) 7 if (arguments[i] > m) 8 m = arguments[i]; 9 // Return the biggest return m;}
arguments具有callee属性,引用当前正在执行的函数。
arguments并非真正的数组,它是一个Arguments对象。
5.4 作为数据的函数
函数最重要的就是它们能够定义和调用,定义和调用是Javascript和大多数程序语言的语法特性。
但是,在Javascript中,函数并不只是一种语法,其也可以作为数据来看待。这意味着,可以把函数赋给变量,存储在对象的属性或数组元素中,作为参数传递给函数等。
例1:函数赋值给变量:
function square(x) { return x*x; }var a = square(); // a contains the number 16var b = square; // Now b refers to the same function that square does
例2:存储在对象的属性或数组元素中
var o = new Object;o.square = function(x) { return x*x; } // function literaly = o.square(); var a = new Array();a[] = function(x) { return x*x; }
关于这点,可以参考《Javascript权威指南》8.3节最后例举的一个例子。
5.5 作为方法的函数及this关键字
对象的方法只不过是对象的一个属性,且该属性引用的是函数类型而已。
因为函数可以赋给任何变量,可以赋给一个对象的任何属性。
var calculator = { // An object literal operand1: , operand2: , compute: function() { this.result = this.operand1 + this.operand2; }};calculator.compute(); // What is 1+1?print(calculator.result); // Display the result
以上,this关键字很重要,任何作方法的函数都被有效的传递了一个隐式的参数,即调用函数的对象(this).
5.6 函数的属性和方法
函数是Javascript对象的一种特殊类型,typeof运算符用于函数类型时会返回字符串“function”
既然函数是对象,它就具有属性和方法,就像其它的对象一样。
● 属性lenght
不同于函数体内arguments的length属性,函数自身的length属性是一个只读属性,返回的是函数需要的实际参数数目。
● 定义函数自身的属性,具有static属性
1// Create and initialize the "static" variable. 2// Function declarations are processed before code is executed, so 3// we really can do this assignment before the function declaration. 4uniqueInteger.counter = ; 5 6// Here's the function. It returns a different value each time 7// it is called and uses a "static" property of itself to keep track 8// of the last value it returned. 9function uniqueInteger() { return uniqueInteger.counter++; // Increment and return our "static" variable}
● 方法 apply() 和 call()
这两个方法可以像调用其它方法一样调用函数。第一个参数都是要调用的函数对象,函数体内这一参数是关键字this的值。
call的剩余参数是传递给要调用的函数的值。
to the function f() and invoke it as if it were a method of the object o, you could use code like this:
f.call(o, 1, 2);
This is similar to the following lines of code:
o.m = f;
o.m(1,2);
delete o.m;
The apply() method is like the call() method, except that the arguments to be passed to the function are specified as an array:
f.apply(o, [1,2]);
For example, to find the largest number in an array of numbers, you could use the apply() method to pass the elements of the array to the Math.max() function:
var biggest = Math.max.apply(null, array_of_numbers);
Javascript学习5 - 函数的更多相关文章
- JavaScript学习09 函数本质及Function对象深入探索
JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...
- Javascript学习之函数(function)
在JS中,Function(函数)类型实际上是对象;每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针. 一 函 ...
- JavaScript学习笔记——函数
javascript函数的声明和调用 将完成某一特定功能的代码集合起来,可以重复使用的代码块. 一.函数的声明方式(创建) A.基本语法 function 关键字 function 函数名([参数1] ...
- JavaScript学习笔记-函数
函数的两种创建方式:函数定义表达式.函数声明语句 编译时,函数声明语句创建的函数会‘被提前’至外部函数的作用域顶部,在该作用域内可以被随意调用: 而函数表达式创建的函数,要调用它必须赋值给一个变量,编 ...
- JavaScript学习笔记-函数实例
函数实例 var p = { a:15, b:'5', f1:function(){ var self = this; console.log(self.a+self.b); f2(); functi ...
- 前端学习 第六弹: javascript中的函数与闭包
前端学习 第六弹: javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) { ...
- JavaScript学习03 JS函数
JavaScript学习03 JS函数 函数就是包裹在花括号中的代码块,前面使用了关键词function: function functionName() { 这里是要执行的代码 } 函数参数 函数的 ...
- JavaScript学习总结-技巧、有用函数、简洁方法、编程细节
整理JavaScript方面的一些技巧.比較有用的函数,常见功能实现方法,仅作參考 变量转换 //edit http://www.lai18.com var myVar = "3.14159 ...
- JavaScript学习笔记(七)——函数的定义与调用
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
随机推荐
- 玩转html5(一)-----盘点html5新增的那些酷酷的input类型和属性
今天正式开始学习html5了,相比html以前的版本,html5新增了好多功能,属性,使我们做出来的界面更加的绚丽,而且使用起来超级简单,这篇文章先来说说html增加的那些input类型和属性. 这些 ...
- 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)
全系列Index: [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一) [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二) [原创]只学到二维数组和结构体,不用链表也能 ...
- java中间==、equals和hashCode差额
java于==.equals().hashCode()和比较两个对象. 关于== ==是easy理解的.java设计java就是要比較两个对象是不是同一个对象. 对于引用变量而言.比較的时候两个引用变 ...
- lunux命令笔记
文件查看命令 ls / -lh ls list / 路径 -l 具体 -lh 具体的人性化显示 -ld 显示文件夹 -i 显示i节点 mkdir /tmp/mulu/mulu2 /tmp/ma/mb ...
- ServiceStack.Hello——跨平台.net REST api服务搭建
ServiceStack.Hello--跨平台.net REST api服务搭建 自己创建: https://github.com/ServiceStack/ServiceStack/wiki/Cre ...
- OOP思想
OOP思想 读者朋友们大家好,我们今天这一讲就接着前面的封装继续讲解,今天就是在前面内容上面的升级,OOP思想中的继承,我们就先来解释一下继承到底是什么意思,我们在什么地方会用到继续. 继承就是,后代 ...
- Hadoop入门进阶步步高(五)-搭建Hadoop集群
五.搭建Hadoop集群 上面的步骤,确认了单机能够运行Hadoop的伪分布运行,真正的分布式运行无非也就是多几台slave机器而已,配置方面的有一点点差别,配置起来就很easy了. 1.准备三台se ...
- jwt (JSON Web Token)官方说明
http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#appendix-A 相关文章 http://haomou.net/2014 ...
- 搭建 Linux 下 GitLab 服务器(转)
这两天因为项目需求需要搭建一个GitLab服务器,遇到了很多问题,参考了很多网络资料,终于搭建成功,在此把这个过程记录一下,利人利己. 一.最终目的 1,在Linux下创建GitLab服务器,客户端能 ...
- STL之容器适配器queue的实现框架
说明:本文仅供学习交流,转载请标明出处,欢迎转载! 上篇文章STL之容器适配器stack的实现框架已经介绍了STL是怎样借助基础容器实现一种经常使用的数据结构stack (栈),本文介绍下第二种STL ...