观看渡一教学视频做的笔记,加强基础知识。
1. 函数
函数声明:
function theFirstName () { }
document.write(theFirstName) //打印的是整个function theFirstName () { }
theFirstName.name 为theFirstName
函数表达式:
var test = function abc () { }
打印test是整个函数function abc () { };打印abc报错
test.name 为abc
var test = function () {}
test.name 为 test
形参和实参位数可以不对映
function sum (a,b) {
console.log(arguments) //实参的值,结果为[1,2,3]
console.log(sum.length) //形参的长度 结果为2
a = 2;
console.log(arguments[0]) //为2
arguments[0] = 3;
console.log(a) //为3
//a与arguments[0]为相互映射的关系,一个变另一个也响应的变
//如果形参多了,就不存在映射关系
}
sum(1,2,3)
练习:
将输入的字符串倒序排列;
function reverse () {
var num = window.prompt('input');
var str = '';
for (var i = num.length-1; i <= 0; i--) {
str += num[i];
}
}
2. 递归
n的阶层:规律 n!= n * (n-1)!
1.找规律
2.找出口
function jc (n) {
if (n == 1 || n == 0) {return 1}
return n * jc(n-1);
}
jc(5);
实现斐波那契数列
fb(n) = fb(n-1) + fb(n-2);
function fb (n){
if (n == 1 || n == 2) {
return 1;
}
return fb (n-1) + fb(n-2)
}
3. 作用域精解
js的两个特点:
1.单线程
2.解释性语言:翻译一行,执行一行;
- 执行前会通篇扫描一遍,看是否有语法错误;
- 然后执行预编译
- 最后翻译一行,执行一行;
预编译
函数声明整体提升;
变量 声明提升;(但这两句话不能解决所以问题)
test();
function test () {}
console.log(a) // a为undefined,其实提升为var a;
var a = 3;
声明的全局变量归window所有,未经声明的全局变量也归window所有;(window就是全局的域)
如:a = 3;// window.a 为3
如:var a = 3; // window.a 也为3
var a = b = 3; // 过程为把3赋给b,然后声明a,然后把b的值赋给a
预编译过程的四部曲
1.创建AO对象
2.找形参和变量声明,把变量和形参名做为AO的属性名,值为undefined;
(变量声明:例如var a = 1;var b = function(){})
3.将实参值和形参统一;
4.在函数体里面找函数声明,值赋予函数体;
(函数声明:例如function d() {})
预编译发生在函数执行的前一刻;
AO没有找Go,函数体里面有if判断,也遵守变量提升;
4. 作用域精解
具体的看视频课时16