函数
函数定义用到function 函数名(参数) { 函数体 :函数体可以编写多条js代码 }
两种不同的函数定义
这种方法定义函数,会被提前加载,因此调用语句可以卸载函数定义之前,因为那个时候函数已经被加载完成了。
这种 方式定义函数是不会被提前加载的,换句话说就是执行到函数定义的语句才会加载这个函数。上面代码是先调用了a() ,而调用a() 的时候还没有加载,强行调用一个不存在的函数。
函数有没有被加载与变量有没有被定义是不同的事情
作用域(全局作用域和函数作用域)
作用域就是指当你要查找到某一个变量的时候,你可以在什么范围内找到这个变量。寻找的范围就是作用域。
全局作用域:
var a = 10;
function test(){
console.log(a);
}
变量a和test函数直接暴露在外面,因此都属于全局作用域。而test函数的函数体,用括号包起来的部分是函数作用域。函数的函数体都属于函数作用域。
因为test函数属于全局作用域,而自己又有一个函数作用域,就形成一个作用域的嵌套。
也就是全局作用域包含了一个函数作用域。在函数作用域里可以访问全局作用域中的变量,但是反过来不行,全局作用域想要调用函数作用域中定义的变量是做不到的。
因此发生作用域嵌套的时候,只能里面访问外面的,外面无法访问里面的。
(作用域一般是针对全局作用域和函数作用域,或者函数作用于和其他函数作用域)
参数传递(参数就是当函数调用的时候传进来的值,很多时候定义参数的时候并不知道调用过程中会有什么样的值传过来)
在函数里面访问额外的参数:
假设:调用add的时候最起码会有一个参数传进来,arguments数组获取第一个位置的元素,第一个位置元素不存在就返回0。
function add(){
if(!arguments[0]){
return 0;
}
}
不知道有多少个参数,所以arguments数组长度未知。但是arguments是一个数组,就有length属性,arguments数组内部元素个数。虽然不知道有多少个参数,但是函数的函数体却可以通过arguments数组的length属性预知未来传入参数个数。