这么长时间没有写博客,就是由于函数这部分比较麻烦,本身一直想抽出大把的时间来研究这个,但是结果倒是一拖再拖,这样很差。有时间就写才是王道啊,否则这计划得一直卡在这里了..javascript
函数:将代码进行封装, 复用的逻辑单元(代码)
对象:无序键值对的集合
数组:有序键值对的集合, 数组的索引号就是键
属性:对象属性的值是一个普通的数据
方法:对象的属性是一个函数
对象的成员:包括属性和方法java
另外关于函数,你应该时刻记住的是:函数也是对象,函数名是一个指向函数对象的指针。所以,函数也能够做为参数传递面试
标准语法:segmentfault
var fn = function(){}; // 只能在声明以后调用
有一种写法也须要注意,可能在面试题中会遇到:数组
var fn = function fn1(){}; // 不会报错
有这样一个例子,可以很好的区分两种写法的差别函数
// 标准写法 var fn = function(){ console.log(fn); // function (){ console.log(fn) } }; fn(); console.log(fn); // function (){ console.log(fn) } // 非主流写法 var fn1 = function fn2() { console.log(fn1); console.log(fn2); } fn1(); console.log(fn1); console.log(fn2);
为了更有说服力,我直接上图吧!this
结论:
函数表达式声明方式中,function后面也能够添加函数名,但仅能在函数内部使用spa
语法:3d
function fn(){}; // 可以在做用域下的任何地方使用
语法:指针
var fn = new Function(param1, param2, body)
Function构造函数能够接受任意数量的参数,但最后一个参数始终被看作函数体,至关于一个小型的js编译器(执行效率低)
var fn = new Function(num1, num2, “return num1+num2”); // 等价于 function fn(num1, num2) { return num1 + num2; } // 或 var fn = function(num1, num2) { return num1 + num2; }
1 函数声明会把整个函数体提高到最前面function fn() {}
,所以调用的位置没有前后之分;函数表达式只会把函数名字提高var fn = function() {};
此时函数做为数据,所以必须先声明后使用
2 函数声明不可以出如今其余语句块中!函数声明可以出现的位置: 全局环境中其余函数内部
我的建议:从代码可维护性出发,尽可能使用函数表达式的方式来声明函数
1.name属性
函数名.name => 获取字符串类型的函数名称
// 外部 function fn1(){}; console.log(fn1.name); // fn1 // 内部 function fn2() { console.log(fn2.name); // fn2 } fn2();
2.length属性
函数名.length => 获取形参的个数,未传参时返回0
// 外部 function fn1(a,b){}; console.log(fn1.length); // 2 // 内部 function fn2(a,b,c) { console.log(fn2.length); // 3 } fn2();
3.caller属性
函数名.caller => 得到调用函数的函数引用(函数在哪被调用),若是在全局中调用当前函数,值为null
var inner = function() { alert(inner.caller); }; var outer = function() { inner(); }; outer(); // function() { inner(); }; inner(); // null
4.arguments属性
arguments只能在函数内部使用,用来获取传入的实参。是一个伪数组
其内部有以下属性:
arguments.length:获取实参的个数
arguments.callee:获取当前函数的引用,通常用在匿名函数递归中
// 阶乘 function factorial(num) { if(num <= 1) { return 1; } else { return num * arguments.callee(num - 1); } }
5.this属性
this会在下一篇博客中详细讲解,先记住一句话:
this的指向和函数执行的环境相关,与它声明的环境无关
形参:函数声明时的参数,起占位做用——函数名.length(形参个数)
实参:函数调用时的参数,实际参与运算的值—arguments.length(实参个数)
当形参个数大于实参时,多余的形参将设置成undefined
当实参个数大于形参时,没法直接得到全部的实参,经过arguments得到实参
参数传递的理解:形参至关于一个具备局部做用域不须要声明的和实参指向相同堆地址对象的值,其类型与实参相同