函数下

279 阅读3分钟

作用域链

全局可以嵌套局部,局部可以嵌套局部....这样由作用域嵌套形成的一条链式结构 - 作用域链

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);
}