创建函数方式
-
方式一 function 关键字创建 具名函数
// foo 叫做 函数名
// ()里边填写函数的 参数function foo(){ console.log('我是一个foo函数'); }
-
方式二 匿名函数表达式
> var bar = function (){
> console.log('我是一个匿名函数');
> }
- 方式三 自执行函数(立即执行函数)
前面加分号用来和上面隔离开。
; (function(){
console.log(‘我是一个自执行函数’);
})()
创建函数后紧跟括号写参数内容,仅调用一次,之后找不到名字无法再使用。
函数返回值
不写返回值,默认是undefined;
只能return一个值,如果要返回多值,需要包装成数组。
return代表结束,之后的语句不再执行。
作用域
作用域 就是变量可以作用的范围(生效的范围)
- 全局作用域 (挂载在window对象上,页面的任何地方都可以使用)
- 局部变量 (只能在自身作用域中使用) 在函数作用域内声明的变量
- 不用var 时,声明的变量默认是个全局变量(严格模式下报错)
作用域链
- 作用域互相嵌套,存在包含关系
- 作用域链:作用域的上下级关系
- 查找变量的规则:使用变量,先在自身查找,找不到往上一级查找。
声明提升和预解析
console.log(a); // undefined 涉及到了声明提升
var a = 100;
————————————————————真实顺序————————————————————————
// var a;
// console.log(a);
// a = 100;
- 提升的仅仅是声明动作,赋值动作不会提升。
- 函数声明也存在提升
- 预解析阶段,会把所有用function 关键字声明的具名函数,提升到作用域最顶部。
say();
function say(){
console.log('hello');
}
- 匿名函数表达式
foo(); // foo is not a function
var foo = function(){
console.log('你好');
}
// 真实顺序
// var foo;
// foo();
// foo = function(){}
递归 深度遍历
// 遍历数组
// 深度遍历
var arr = [1, [10,[101,102,103],12], 3, 4, [21,22,23], 6, [31,32,33], 8, 9];
function traArr(arr){
for(var i = 0;i<arr.length;i++){
// 递归思想,调用自己
if(arr[i] instanceof Array){
traArr(arr[i])
}else{
console.log(arr[i]);
}
}
}
traArr(arr)
- x的y次方 === x的y-1次方 * x
function pow(x, y) {
if(y===1){
return x;
}
return pow(x, y - 1) * x;
}
// pow(2,4) ====> pow(2,3) *2 ===>
pow(2,2)*2 *2 ==> pow(2,1)*2 *2*2 ===> 2*2 *2*2
// 不喊停,递归就会一直递归下去
// 能有一个准确值的时候就可以停下 递归了
console.log(pow(3,4));