javascript 函数初探 (一)--- 神马是函数
神马是函数?
所谓函数,本质上是一种代码的分组形式。我们可以通过这种形式赋予某组代码一个名字,以便与之后的调用。下面,我们来示范以下函数的声明:
function sum(a, b){
var c = a + b;
return c;
}
一般来说,函数声明通常由一下以下几部分组成:
1. 关键词 function;
2. 函数名称,即这里的sum;
3. 函数所需的参数,即这里的a, b。一个函数通常具有0个或多个参数。参数之间用逗号分隔。
4. 函数所要执行的代码块,我们称之为函数体。
5. return子句。函数通常都有一个返回值,如果一个函数没有显式的返回值,我们就会默认他的返回值为undefined。
需要注意的是,一个函数只能有一个返回值,如果我们需要同时返回多个值,可以考虑一下把她们放进一个数组中,以数组元素的形式返回。
以上所讲的语法过程叫做函数声明。在javascript中。函数声明只是创建函数的方法之一,改天我们会介绍其她的。。。。。。。(。・_・)/~~~
累觉不爱(。・_・)/~~~(。・_・)/~~~(。・_・)/~~~(。・_・)/~~~(。・_・)/~~~(。・_・)/~~~(。・_・)/
如果我们需要使用一个函数,那就必须去调用她,那就在她后面加一个用来传递参数的小括号吧!
我们来调用一下上面的函数 ======》》》》
, ); her; //返回 3
在定义一个函数的同时,我们往往会设置这个函数所需要的调用参数。当然,也可以不给她设置参数。假如您给设定了参数,在调用的时候又忘了传递参数相关的参数值,那么,javascript引擎会自动将没有传递的参数设定为undefined。
技术角度上说参数又分为形参和实参两种。
形参是指定义函数时所用的那些参数 。如sum(a, b)中的a, b。
实参是指调用函数时所传递进来的那些参数。 如上述sum(1, 2)中的1,2。
对于那些已经传递进来的参数,javascript是来这不惧的,反正我用不到的我就无视你,自动忽略。。。。,实际上我们还可以创建一些在参数方面更为灵活的函数。那就要跪谢函数内部的arguments变量了。这个变量是函数们生下来就有的,在函数中都能调用。她能返回函数所接受的所有参数。 d=====( ̄▽ ̄*)b 是不是无比强大!!!
d=====( ̄▽ ̄*)b d=====( ̄▽ ̄*)b d=====( ̄▽ ̄*)b
例如:
function her(){
return arguments;
}
her(); // 返回 [];
her(, , , true, JY); // 返回 [1, 2, 3, true, JY]
通过arguments我们接着完善sum函数;
function sum(){
, nums=arguments.length;
; j<nums.length; j++){
res += nums[j];
}
return res;
}
sum(, , );
sum(, , );
sum();
1.表达式arguments.length 返回的是函数被调用时所接受的参数。但是arguments实际上不是一个数组,而是一个类似于数组的对象。(当然,实际上,在函数funcArg中,调用arguments是不必要写成funcArg.arguments,直接写arguments即可)
可以验证一下arguments是不是数组
Array.prototype.testArg = "test";
function funcArg() {
alert(funcArg.arguments.testArg);
alert(funcArg.arguments[]);
}
alert(new Array().testArg); // result: "test"
funcArg(); // result: "undefined" "10"
2.arguments对象的长度是由实参个数而不是形参个数决定的。形参是函数内部重新开辟内存空间存储的变量,但是其与arguments对象内存空间并不重叠。对于arguments和值都存在的情况下,两者值是同步的,但是针对其中一个无值的情况下,对于此无值的情形值不会得以同步。如下代码可以得以验证。
function f(a, b, c){
alert(arguments.length); // result: "2"
a = ;
alert(arguments[]); // result: "100"
arguments[] = "qqyumidi";
alert(a); // result: "qqyumidi"
alert(c); // result: "undefined"
c = ;
alert(arguments[]); // result: "undefined"
}
f(, );
3.由JavaScript中函数的声明和调用特性,可以看出JavaScript中函数是不能重载的。
根据其他语言中重载的依据:"函数返回值不同或形参个数不同",我们可以得出上述结论:
第一:Javascript函数的声明是没有返回值类型这一说法的;
第二:JavaScript中形参的个数严格意义上来讲只是为了方便在函数中的变量操作,实际上实参已经存储在arguments对象中了。
另外,从JavaScript函数本身深入理解为什么JavaScript中函数是不能重载的:在JavaScript中,函数其实也是对象,函数名是关于函数的引用,或者说函数名本身就是变量。对于如下所示的函数声明与函数表达式,其实含以上是一样的(在不考虑函数声明与函数表达式区别的前提下),非常有利于我们理解JavaScript中函数是不能重载的这一特性。
function f(a){
;
}
function f(a){
;
}
// 在不考虑函数声明与函数表达式区别的前提下,其等价于如下
var f = function(a){
;
}
var f = function(a){
;
}
4.arguments对象中有一个非常有用的属性:callee。arguments.callee返回此arguments对象所在的当前函数引用。在使用函数递归调用时推荐使用arguments.callee代替函数名本身。
function count(a){
){
;
}
return a + arguments.callee(--a);
}
);
alert(mm); //55
arguments.callee表示引用当前正在执行的函数,或者说是调用arguments.callee的函数对象的引用,它给匿名函数提供了一种自我引用的方式。
var func = function() { alert(func === arguments.callee);}func() // true
执行上述代码,可以看到alter出来的结果是true,注意,此处用的是“===”,就是说func与arguments.callee对象类型和值都相等。
arguments.callee一般会用来同匿名函数一起使用。
再看一递归调用例子:求一个数的阶乘:
普通实现
function fun2(n) { ) { ); } ;}
)
用匿名函数
ar r2 = (function(n) { ) { ); } ;})
javascript 函数初探 (一)--- 神马是函数的更多相关文章
- 函数:递归是神马 - 零基础入门学习Python022
函数:递归是神马 让编程改变世界 Change the world by program 我们这节课的主题叫递归是神马,将通过小甲鱼带感的讲解,来告诉大家神马是递归!如果说优秀的程序员是伯乐,那么把递 ...
- javascript 函数初探 (四)--- 回调函数
回调函数 既然函数与任何被赋值给变量的数据是相同的,那么她当然可以像其他数据那样被定义.删除.拷贝,以及当成参数传递给其它函数. 我们定义一个函数,这个函数有两个函数类型的参数,然后他会分别执行这两个 ...
- javascript对象初探(一)--- 构造器函数
我们可以通过构造器函数(简称构造函数)来创建对象: function Her(){ this.child = 'Jon'; } 为了使用该函数来创建对象,我们需要使用new操作符,例如: var sh ...
- javascript 函数初探 (五)--- 几种类型的函数
即时函数: 目前我们已经讨论了匿名函数在回调时的应用.接下来,我们来看看匿名函数的另一种应用实例 --- javascript即时函数: 比如: ( function(){ alert('her'); ...
- javascript 函数初探 (六)--- 闭包初探#2
首先,我们需要声明一个全局函数的占位符.尽管这种占位符不是必须的,但最好还是声明一下,然后我们重新将函数F()定义一下: var inner; var F = fucntion(){ var b = ...
- javascript 函数初探 (三)--- javascript 变量的作用域
javascript 变量的作用域: 这是一个至关重要的问题.特别是当我们从别的语言转向javascript时,必须要明白一点,即在javascript中,变量的定义并不是以代码块作为作用域的,而是以 ...
- 零基础入门学习Python(22)--函数:递归是神马
知识点 递归是神马? 递归是属于算法的范畴. 递归就是函数调用自身的一种行为. >>> def g(): return g() >>> g() Traceback ...
- javascript 函数初探 (六)--- 闭包初探#3
相关定义与闭包: 实际上,每个函数都可以被认为是一个闭包.因为每个函数都在其所在域(即该函数的作用域)中维护了某种联系. 但在大多数的时候,该作用于在函数体内被执行完之后就被自行销毁了.---除非发生 ...
- JavaScript初探系列(六)——函数
一.概述 (一)函数的声明 JavaScript 有三种声明函数的方法. (1)function 命令 function命令声明的代码区块,就是一个函数.function命令后面是函数名,函数名后面是 ...
随机推荐
- 在MacOS 10.12上安装Tomcat8.5
在MacOS 10.12上安装Tomcat8.5 原文链接:https://wolfpaulus.com/journal/mac/tomcat8/ Context 已安装Java,使用java -ve ...
- html5的audio在safari(windows)中无效
因为mac下的safari不会有这样的问题(OSX默认都装的有QuickTime),而windows下用safari的比例实在小不用考虑. apple算是偷了一个小懒.而所谓的需要quicktime并 ...
- jQuery 2.0.3 源码分析core - 整体架构
拜读一个开源框架,最想学到的就是设计的思想和实现的技巧. 废话不多说,jquery这么多年了分析都写烂了,老早以前就拜读过, 不过这几年都是做移动端,一直御用zepto, 最近抽出点时间把jquery ...
- ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调
近期项目中可能要用到Flash存取数据,并与JS互调,所以就看了一下ActionScript 3.0,现把学习结果分享一下,希望对新手有帮助. 目录 ActionScript 3.0简介 Hello ...
- VMware Tools的简易安装---解决Ubuntu 14.10不能满屏显示问题
由于使用的VMware WorkStation是中文破解版,安装时又是简易安装,因此VMware Tools并没有安装上,导致Ubuntu 14.10在VMware中装上之后,并不能满屏显示,如图1所 ...
- Easyui 让DataGrid适应浏览器宽度
DataGrid有100%宽度的设置,但是有时不是很让人满意,比如你你放大或者拉放你的浏览器,那么DataGrid只维持第一次加载的宽高,非常难看 $('#List').datagrid({ url: ...
- ASP.NET MVC之国际化(十一)
前言 在项目中遇到国际化语言的问题是常有的事情,之前在做关于MVC国际化语言时,刚开始打算全部利用AngularJS来实现,但是渐渐发现对于页面Title难以去控制其语言转换,于是对于页面Tiltle ...
- Web APi之控制器选择Action方法过程(九)
前言 前面我们叙述了关于控制器创建的详细过程,在前面完成了对控制器的激活之后,就是根据控制器信息来查找匹配的Action方法,这就是本节要讲的内容.当请求过来时首先经过宿主处理管道然后进入Web AP ...
- SubSonic3.0使用例子
前段时间开发的框架使用了SubSonic2.2以后,觉得开发效率提高了不少,后期维护起来也非常方便,不由的喜欢上了SubSonic.中间有想过升级到更高版本,但度娘一下就放弃了,只有极少的中文版说明, ...
- II7.0 发布 MVC 4.0 三个小问题记录
1,403.14-Forbidden Web 服务器被配置为不列出此目录的内容 根据提示更改:使用 IIS 管理器启用目录浏览. 打开 IIS 管理器. 在“功能”视图中,双击“目录浏览”. 在“目录 ...