一、函数(编程遵循高内聚,弱耦合)
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课程" ,一个值得推荐的"渡一教育"。