一、函数(编程遵循高内聚,弱耦合) 1、定义: 函数声明:function test(){} 函数表达式:命名款:var test = function abc(){}, 匿名款:var test = function (){},起名也没用,干脆匿名吧。
2、参数:形参,实参。有了它俩函数上天了...举个栗子
function test(a,b){ //var a, // b; //test.length = 2; //console.log(arguments.length);2 return a + b; } test(1,2);其中a,b为形参;1,2为实参。传递参数时,函数内部如下: 隐式声明两个变量:a,b(函数有隐式属性test.length,表示形参长度) 隐式arguments--[1,2]类数组,表示实参列表 形参实参绑定,相互映射,a-->arguments[0];b-->arguments[1] JavaScript与Java不同,天生不定参。(好处大大的,例如Excel求和功能)
3、return的两个作用 终止函数 返回值
二、递归
话不多说,举个栗子,往明白了看。
牢记两点:1、找规律;2、找出口
//写一个函数,实现n的阶乘 // n! = n * (n-1)! // 递归: // 1.找规律 // 2.找出口 // 只有一点好处,代码简洁,速度贼慢!!! function mul(n){ if(n == 1 || n == 0){ return 1; } return n * mul(n-1); } mul(5); // mul(5) ==> 5 * mul(4);5 * 24 // mul(4) ==> 4 * mul(3);4 * 6 // mul(3) ==> 3 * mul(2);3 * 2 // mul(2) ==> 2 * mul(1);2 * 1三、预编译(噩梦的开始)
高潮掀起之前,先来点前戏。听听Javascript运行三步曲。 1、语法分析:通篇扫描 2、预编译:大闹天空 3、解释执行:解释一行执行一行
都说英雄难过预编译关,到底怎么回事儿。老样子,高潮之前,还有前戏。
预编译前奏:暗示全局变量(imply global),任何变量未经声明就赋值,归全局对象window所有。 一切声明的全局变量,都归window所有。
辛辛苦苦声明的变量,咋就成window的了。别着急,往下看:
敲黑板,敲黑板,重点来了!!!
预编译发生在函数执行的前一刻,过程如下: 1、创建GO(Global Object)/AO(Activation Object)对象(执行期上下文) 2、找函数里的形参和变量声明,将形参名和变量声明的名儿作为AO对象的属性名,值为undefined 3、将实参值和形参值相统一 4、找函数体里的函数声明,值为函数体
如下题:汇集了imply global、预编译为一体的身材苗条的鄙视题。
a = 100; function demo(e){ function e(){} arguments[0] = 2; console.log(e);//2 if(a){ var b = 123; function c(){} } var c; a = 10; var a; console.log(b);//undefined f = 123; console.log(c);//undefined console.log(a);//10 } var a; demo(1); console.log(a);//100 console.log(f);//123 /* GO{ a: undefined -> 100 demo: function demo(){} f: 123 } AO{ e: undefined -> function e(){} -> 2 b: undefined c: undefined,现在if内不允许声明函数 a: undefined -> 10 } */以上内容属二哥原创,整理自 "渡一教育Javascript课程" ,一个值得推荐的"渡一教育"。