作用域链
全局可以嵌套局部,局部可以嵌套局部....这样由作用域嵌套形成的一条链式结构 - 作用域链
1、当将一个变量当做数据使用的时候,例如:输出、将他当做一个数据去运算;先在当前作用域中找变量的定义,如果找到了,就输出他的值,如果找不到,就去上级作用域中找,上级找到了,就输出上级的值,直到全局,全局找到了,就输出全局的值,全局找不到,就报错。
var a = 1
var b = 2
function f1() {
var b = 5
function f2() {
var a = 3
var c = a + b
console.log(c);
}
f2()
}
f1()
2、给变量容器赋值的时候,先在当前作用域中找变量的定义,如果找到了,就给他赋值,找不到,就去上级作用域中找,上级找到了,就给上级的变量赋值,直到全局,如果全局找到了,就给全局变量赋值,如果全局找不到,就在全局定义这个变量并赋值。
var a = 1
function f1() {
// var a = 2
function f2() {
// var a = 4
var a = 3
}
f2()
console.log('f2中的a是' + a); // 3
}
f1()
console.log(a); // 3
作用域链和预解析案例
fn3(); // b=9 c=9
console.log(c); // 9
console.log(b); // 9
console.log(a); // 报错:a is not defined
function fn3() {
var a = b = c = 9; // 相当于:var a = 9; b = 9; c = 9
console.log(a); // 9
console.log(b); // 9
console.log(c); // 9
}
var a = 4;
console.log(a); // 4
a = 6;
console.log(a); // 6
function a() {
console.log('哈');
}
a(); // 报错:a is not a function
a = 10;
console.log(a);
function fn(a) {
console.log('我是 fn 函数')
a()
function a() {
console.log('我是函数 a')
}
}
fn(10)
全局预解析:
function fn(a) {
console.log('我是 fn 函数')
a()
function a() {
console.log('我是函数 a')
}
}
开始执行:
fn(10)
实参给形参赋值在预解析之前。
var a = 10
局部预解析:
function a() { // 函数预解析会覆盖形参的值
console.log('我是函数 a')
}
console.log('我是 fn 函数')
a()
递归函数
函数内部调用函数自己
步骤:
1.定义一个空函数
2.调用它 - 分析实参和返回值
3.根据调用语法 - 编写函数代码
4.根据需求,先分析 首先需要当前数字 + 数字 - 1
5.换思路:5的阶和 = 5 + 4的阶和 fn函数作用是求1个数字的阶和 5的阶和 = fn(5) 4的阶和 = fn(4)
6.分析代码:什么时候应该停止,停止的时候写什么
斐波那契数列 (1 1 2 3 5 8 13 21 34 55 ...)
根据位置,求这个位置上的数字是几
function fn(num) {
if (num < 3) {
return 1
}
// return 位置num-1的数字 + 位置num-2的数字
return fn(num - 1) + fn(num - 2)
}
var n = fn(11)
console.log(n);
编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数求1+1/3+...+1/n
function fn(n) {
if (n === 2) {
return 1/2
} else if (n === 1) {
return 1
}
return 1/n + fn(n - 2)
}
var sum = fn(10) // 1/10 + fn(8)
console.log(sum);
对象
是一种比较复杂的数据; 其他数据,都是一个内存空间存储一个数据;对象是一个内存空间存储多个数据
var ls = {
'name': '李四',
age: 13,
'background-color': 'red',
'background/color': 'red'
}
console.log(ls);
对象的基本操作
增
对象.键 = 值
对象['键'] = 值
obj.money = 1000000
修改
obj['name'] = '张小三'
对象中的键是唯一的,不可以重复的
删除
delete 对象.键
delete 对象['键']
delete obj.wife
delete obj['study']
对象的遍历
for (var key in obj) {
// console.log(key);
// console.log(obj.键);
// console.log(obj['键']);
// console.log(obj.key); // 当使用变量代表键的时候,不能使用 . 的语法了
console.log(obj[key]);
}
事件
语法:标签.on事件类型 = 函数的值
事件的类型:
鼠标左键单击 - click
鼠标左键双击 - dblclick
鼠标移入事件 - mouseover
鼠标移出事件 - mouseout
键盘按下 - keydown - 通常在项目中不用
键盘弹起 - keyup - 用的比较多
获取焦点 - focus
失去焦点 - blur
改变事件 - change
提交事件 - submit
针对整个浏览器的加载事件 - load
btn.ondblclick = function() {
console.log('快速的点击了两次!');
}
window // 代表整个浏览器窗口 - 当页面中所有的资源都加载完成后会执行的事件
window.onload = function() {
console.log(777);
}