Function是javascript里最常用的一个概念,javascript里的function是最容易入手的一个功能,但它也是javascript最难理解最难掌握的一个概念。
1. Function类型是js中引用类型之一,每个函数实际上都是Function类型的实例对象,具有自己的属性和方法。正因为函数式对象,所以函数名实际上也是一个指向函数对象的指针。
2. 常用的函数定义方式
1. 函数声明:
function sum(a , b ){return a+b;}
2. 表达式:
var sum = function(){return a+b; }; //注意分号 //两种方式的区别: //解释器会率先读取函数声明,并使其在执行之前可以访问,而使用表达式则必须等到解析器执行到它所在的代码行,才会真正被解释执行(变量声明提前,而值留在原地)alert (sum (10 ,10));function sum(a ,b){ return a+b;}//↑上面的代码会正常执行,因为在代码执行前,解析器通过函数声明提升,读取并将函数声明添加到执行环境中,放到代码树的顶部alert (typeof sum);alert(sum(10 , 10));var sum = function (a ,b){ return a+b;}//↑报错,原因在于函数位于一个初始化语句中,不是一个函数声明,不会被提前,而只会把var sum提前,用typeof操作符显示sum是undefined,所以报错
3. 函数名仅仅保存指向函数对象的指针,因此函数名与包含对象指针的其他变量没什么不同,也就是说,一个函数对象可以有多个名字:
function sum(a , b ){return a+b;}console.log(sum(2 ,3)); //5var anotherSum = sum; //变量anotherSum也指向了同一个函数对象console.log(anotherSum(4 , 5)); //9sum = null; //sum变量不再保存函数对象的指针了console.log(anotherSum(1 , 3)); //anotherSum这个变量仍能调用
4. JS为何没有重载这个概念。
function add(a){return a+3 ;}function add(a){return a+5;}var result = add(3); //8//两个函数同名了,结果只能是后一个函数覆盖前一个,所以不能重载
5. 函数的内部属性:函数内部,有两个特殊的对象,arguments和this
1. arguments:
arguments是个类数组对象,包含着传入函数的所有参数,这个对象有一个叫callee的属性,属性值是一个指针,指向拥有这个arguments对象的函数本身
function foo (){var a =arguments.callee; return a.toString();}foo();/*返回结果: "function sum(){ var a =arguments.callee; return a.toString(); }"也就是说,一个函数内部,arguments.callee指的就是这个函数本身。这个函数在递归调用时有点用,有许多缺陷,在ES5严格模式被移除*/
2. this:简单来说,this指的就是函数执行的环境对象,在哪个对象中执行,this就指哪个对象。展开来说比较复杂,单开一篇
新闻热点
疑难解答
图片精选