JavaScript每日一学 —— 第五天

目录

1.函数的作用域

2.js的设计缺陷

3.作用域链

4.变量的生命周期

5.预解析

6.递归函数

7.数组

8.arguments对象(伪数组)


1.函数的作用域

作用域:指的是访问数据时的规则(区域、范围)。有函数的地方就有作用域

作用域的分类

        全局作用域:整个script标记内部都属于全局作用域

        局部作用域:指的是函数内部

变量的分类

        全局变量,声明全局作用域里面的变量,称之为全局变量(声明在函数外部)

        局部变量,声明在函数内部的变量,称之为局部变量

访问数据规则

        外部不能访问函数内部的变量

        函数内部可以访问函数外部的变量

注意:

在函数内部声明的变量,如果没有使用var关键字的话那么它就属于全局变量

2.js的设计缺陷

(1)要求声明变量时必须使用var关键字,但是在实际的使用过程中你不使用其实变量也可以声明

function fn(){
    // 要求在函数内部声明的变量属于局部作用域,结果呢?
    //就是由于没有使用var关键字,既然在函数外部可以使用
     b = 30
}
fn()
console.log(b)//30

(2)在函数内部不使用var,局部变量会变成全局变量

(3)关于name问题:+name不是关键字,但是你使用后,会出现一些其他的情况

注意:window是js里面最大的一个对象,js里面所有的东西都属于这个对象;window里面有一个默认的name属性,值是空的

// 问题1:使用name声明变量,注释后去打印结果依旧存在
var name = '张三'
console.log(name)//'张三'

//把name注释掉,打印时依然存在
//var name = '张三'
console.log(name)//'张三'


// 问题2:当你使用name给它赋值为引用数据类型时,不会按照数据类型规则去解析
//(因为你给name赋值的所有数据类型它都会转成字符串类型)
var name = function(){
     console.log('你好!')
 }
console.log(name)  
name() // name is not a function

var name = 10
console.log(window)

3.作用域链

作用域链把作用域详细进行了划分,把全局作用域称之为0级作用域

把函数内部划分为1级、2级、3级等等作用域(函数嵌套函数的情况下,以函数的嵌套关系划分)

把这些作用域连接起来形成一个类似于链条的关系,把这种情况称之为作用域 

访问规则

先在当前的作用域里面进行查找

如果找到就使用,如果没有找到就去上一级作用域里面进行查找,直到找到0级还是没有就报错了

// 0级作用域
var a = 10
function fn(){
    // 1级作用域
    var b = 66
    var c = '小c同学'
    function fn2(){
        // 2级作用域
        // var c = 88
    console.log(c)
    }
    fn2()
}
fn()

4.变量的生命周期

指的是变量从声明到销毁的过程

全局变量:当网页关闭后才销毁

局部变量:当函数执行完毕就销毁 

网页里面一些数据使用完毕后,浏览器会自动进行回收(垃圾回收机制)

5.预解析

浏览器不会直接按照你写代码的顺序直接去解析代码,需要先把代码加工处理后再去逐行解析代码,把这个加工处理代码的过程称之为预解析

步骤

        先把变量声明和函数声明提升到当前作用域的最顶端

        再根据原先代码的书写顺序逐行执行代码

说明

        变量声明指的是 var 变量名称

        函数声明指的是整个函数体,不包括函数调用 function fn(){}

注意:

        如果把函数赋值给一个变量,那么函数不会进行变量声明提升

var a = 3;
function fn() {
    var b = 4;
    alert(a);
    alert(b);
    function me() {
        alert(b);
    }
    me();
}
fn();
alert(a);


/*
0级作用域预解析
var a
function fn() {
    var b = 4;
    alert(a);
    alert(b);
    function me() {
        alert(b);
    }
    me();
}
a = 3;
fn();
alert(a);
1级作用域预解析
var a
function fn() {
    var b
    function me() {
        alert(b); // 4
    }
    b = 4;
    alert(a); // 3
    alert(b); // 4
    me();
}
a = 3;
fn();
alert(a); // 3
*/

6.递归函数

递归指的是函数自己调用;递归函数也是一种算法,类似于循环的算法

递归必须有出口,也就是结束条件,若没有就成了死循环了

注意:递归是比较好用的,但是得发现规律才行

//需求:1+2+3+....+100的和?
function getSum(n){
    if(n == 1){
        return 1
    }
    return n + getSum(n-1)
}
//斐波那契数列:1、1、2、3、5、8、13、21、34……
//规律:这个数列从第3项开始,每一项都等于前两项之和  
//fb(n) = fb(n-1) + fb(n-2)
function fb(n){
    if(n == 0 || n = 1){
        return 1
    }
    return fb(n-1) + fb(n-2)
}

7.数组

数组就是一组数据的集合,说明数组里面可以存储很多的数据

声明方式:

        [ ] 字面量方式

        new Array() 构造函数方式,是创建对象的一种方法(构造函数也是函数,只不过它的功能更为强大,可以直接创建对象)

注意点:构造函数方式创建的数组,如果给里面传递一个(只有一个数组元素)数值类型的数据,那么它会表示限定数组长度为多少

//字面量方式
var arr = ['张三', '王成']

//构造函数方式
var arr = new Array('张三', '王成', '李四')


//遍历数组
var arrAge = [18, 20, 24, 19, 23]
for(var i=1;i<=arrAge.length;i++){
    console.log(arrAge[i])
}

数组下标:下标、索引(index)

        在创建数组的时候,默认会给每一个数组成员(元素)添加一个编号,用于区分不同的数组元素,把这个编号称之为下标

        数组的下标默认是从0开始的

        数组下标作用:可以用来获取数组元素、删除、增加、替换等等

数组属性:length 表示数组长度

数组分类:

        真正的数组:就是通过字面量或者构造函数创建出来的

        伪(类)数组:不是真正的数组,但是可以使用数组的属性和方法,把这种数组称之为伪数组

8.arguments对象(伪数组)

作用:用来保存实参里面的数据,当实参或者形参的个数不确定的情况下使用

部分属性:arguments.length 表示实参的个数

                  arguments.callee.length 表示形参的个数

                  arguments.callee() 表示的是当前函数的名称

应用

//1.求数组内若干个数的和
function getSum(){
    var sum = 0
    for(var i=0; i<arguments.length; i++){
        sum += arguments[i]
    }
    return sum
}
var res = getSum(10, 20, 30, 60, 80)
console.log(res)


//2.控制实参的个数
function fn(a, b, c){
    //形参的个数
    console.log(arguments.callee.length)
    //实参的个数
    console.log(arguments.length)
    if(arguments.length > 3){
        alert('亲,实参只能传递三个哦!')
    }
}   
fn(10, 20, 30,40)


//3.形成递归函数
var i = 0
function fn2(){
    i++
    console.log(i+'、arguments你需要好好理解下!')
    if(i<10){
        //等同于fn2()
        arguments.callee()
    }
}
fn2()

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值