声明函数
ECMAScript规定了三种声明函数方式
构造函数
var printName = new Function("console.log('Byron');");
函数声明
function functionName(){
statement;
}
函数表达式(匿名函数)
var printName = function(){
console.log('Byron');
};
参数
实参小于形参 输出undefined
实参和形参是一一对应的关系
在函数内部,你可以使用Arguments对象获取到该函数的所有传入参数
Arguments对象内容 和 参数一一对应的
重载
重载是很多面向对象语言实现多态的手段之一,在静态语言中确定一个函数的手段是靠方法签名——函数名+参数列表,也就是说相同名字的函数参数个数不同或者顺序不同都被认为是不同的函数,称为函数重载
在JavaScript中没有函数重载的概念,函数通过名字确定唯一性,参数不同也被认为是相同的函数,后面的覆盖前面的,这是不是意味着JavaScript不能通过重载功能实现一个函数,参数不同功能不同呢?
如果函数名和变量名重名的话,声明提前
我们可以通过Arguments来实现类似的重载功能。
function add (){
var sum = 0 ;
for(var i = 0 ; i < arguments.length ; i++){
sum += arguments[i];
}
return sum;
}
add(1,2,3,5)
声明前置
和变量的声明会前置一样,函数声明同样会前置,如果我们使用函数表达式那么规则和变量一样。其实光靠文字来说明,很难理解。还是直接上代码看实例。
为什么出现这样的结果呢?函数表达式方式的声明类似于:
var multi = 123;
那既然是表达式 ,表达式怎么能提前呢?所以会报错。这也是函数声明和函数表达式之间的区别。
其实是在函数执行的过程中,Javascript的内部先将变量和函数优先放置在作用域的最顶层。
作用域
JavaScript的作用域是靠函数来形成的,也就是说一个函数内定义的变量函数外不可以访问。
for循环中的变量是全局的,虽然变量后面紧跟着括号是大括号。
在声明变量的时候需要var,这样声明的变量作用域才符合我们上面提到的规则。不写var会声明一个全局的变量,这是我们在编程中应该要避免的,即使真的需要全局变量,也应该在最外层作用域使用var声明。
表达式
JavaScript表达式有几种形式
. 原始表达式-----常量、变量、保留字
. 对象、数组初始化表达式
var obj = {a:1,b:2};
var a = [1,2,3];
. 函数定义表达式
var fn = function(){}
. 属性访问表达式
Math.abs
. 调用表达式
alert('hello');
. 对象创建表达式
new object();
立即执行函数
先创建了一个匿名函数,然后不传入参数调用它,这就变成了立即执行函数:
(function(){})();
主要是用于常用组件的开发,比如说轮播组件等等。