JavaScript 学习笔记 -- Function
JS 中 函数、继承、闭包、作用域链。。。 一直都是硬伤,一碰到这样的问题头就大了。但是如果我继续着说:我不会,就真的无药可救了。要勇敢地说出:我的字典里就没有不会这个词,吼吼。。正好昨天在书城里看了本JS红宝书,还没有看完,先记录下:
Function-函数在JS中有两种使用方法:
(1)函数声明: 声明和调用是没有严格的先后顺序的
Greet(); //executed correctly. there is not the strict order between declaration and invoking
//a standard statement of a function
function Greet (name) {
alert("Hello, " + (name || "JS"));
}
(2)函数表达式: 声明和调用是有顺序要求的
//myFun(); //Wrong: Uncaught TypeError: Property 'myFun' of object [object Object] is not a function
//another statement: function expression
var myFun = function(name){
alert("Hello, " + (name || "JS"));
}
//like a variable, need to be declared firstly
myFun("Tom");
其他的区分倒不记得了,稍后去度娘那儿问下。现在用函数来展示下阶乘的递归实现:
function factorial (num) {
if(num == 1)
return 1;
else
return num * factorial(num-1);
}
alert(factorial(5)); // 120 - OK
正常的使用。但在JS中Function也是一个对象,可以像一般变量那样使用,具体指代的是函数入口的指针,与委托类似。在不济,就是把整个函数的定义赋值给目标变量(我就是按照这种理解的)
//used as a variable
var fact = factorial;
alert(fact(5)); // 120 - OK
但是这是个递归的实现,递归就是不断重复地调用自身。上面的用法就是把函数的实现过程委托给一个变量来执行。但是函数体中调用自身的函数仍然指向原函数,此时如果更改了原函数,结果就大不一样:
factorial = function(){return 1};
alert(fact(5)); //5 - effected by the original function
这就是不严谨的Bug, 递归一般用arguments.callee来替代函数自身:
// - correct usage
function factorial (num) {
if(num == 1)
return 1;
else
return num * arguments.callee(num-1);
}
还有另外一种用法:
// mark
var myFactorial = (function f (num) {
if(num == 1)
return 1;
else
return num * f(num-1);
});
alert(myFactorial(5)); //
这种语法真没见过,Mark。。。
JavaScript 学习笔记 -- Function的更多相关文章
- Java程序猿的JavaScript学习笔记(8——jQuery选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿JavaScript学习笔记(2——复制和继承财产)
计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...
- Java程序猿的JavaScript学习笔记(3——this/call/apply)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿JavaScript学习笔记(4——关闭/getter/setter)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- Java程序猿JavaScript学习笔记(14——扩大jQuery UI)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- JavaScript学习笔记之数组(二)
JavaScript学习笔记之数组(二) 1.['1','2','3'].map(parseInt) 输出什么,为什么? ['1','2','3'].map(parseInt)//[1,NaN,NaN ...
- JavaScript学习笔记[0]
JavaScript学习笔记[0] 使用的是廖雪峰JavaScript教程. 数据类型 Number 表示数字,不区分浮点整形. === 比较时不转化数据类型. == 反之. NaN与任何值都不想等, ...
- Java程序猿的JavaScript学习笔记(1——理念)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- JavaScript:学习笔记(9)——Promise对象
JavaScript:学习笔记(9)——Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...
随机推荐
- BZOJ2038 小z的袜子
题意:给一些数,然后每次询问一段区间,问从这个区间中抽走两个数,抽到相同的数的概率 正解:莫队算法 今天新学习了莫队算法,感觉好神,离线的询问好像都可以用莫队. 要不是坑爹的HNOI2016考了两道莫 ...
- [PHP 作为iOS后台Json格式HTTP通信及文件上传的实现]
1.数据库连接 configmysql.php <?php $q = mysql_connect("localhost:8889","root",&quo ...
- pack、unpack自制二进制“数据库”
引言 pack.unpack函数,如果没有接触过socket,这个可能会比较陌生,这两个函数在socket交互的作用是组包,将数据装进一个二进制字符串,和对二进制字符串中的数据进行解包,这个里面有好多 ...
- Git及Github入门笔记
简介 Git是一个分布式版本控制系统(你可以通过Git来管理你的代码以及相关文档,可以在自己电脑上管理,同时也可以和同事协同使用管理),Github为Git提供一个服务器(简单的说,就是你可以把你的代 ...
- 翻译:通往WinDbg的捷径(一)
原文:http://www.debuginfo.com/articles/easywindbg.html译者:arhat时间:2006年4月13日关键词:CDB WinDbg 导言你钟情什么样的调试器 ...
- JavaWeb学习总结-09 JDBC 学习和使用
一 JDBC相关概念介绍 1.1 数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...
- CDN网络(二)之配置和优化CDN核心缓存软件--squid
前言 squid是众多CDN厂商使用的核心缓存软件,都在已有的基础上进行二次开发.在部署squid的时候,建议遵循下面的规范. 1. 使用大内存服务器 对于热点文件,我们让squid用内存缓存,这样大 ...
- IOS OC 计算器算法(不考虑优先级)
个人见解:为还在计算器算法方面迷惑的同学一个数据处理解决方案:定义一个可变数组array,一个可变字符串str,使字符通过[array addObject:str];方法添加到可变数组,每当触发运算符 ...
- mvn添加本地jar
mvn install:install-file -DgroupId=com.oracle "-DartifactId=ojdbc6" "-Dversion=11.2.0 ...
- ----------jqery和js如何判断checkbox是否选中 --------两个单选按钮如何选一个,且用jquery获取被选的值
jqery和js如何判断checkbox是否选中 jquery: <div id="divId" class="divTable"> <div ...