JavaScript高级 笔记_局部对象和全局函数-程序员宅基地

技术标签: Web开发笔记  javascript  

1. 预编译

1.1 全局对象(GO对象) window

js引擎会整合所有<script>标签中的内容, 产生window对象

全局变量: 全局对象的一个属性

全局函数: 全局对象的一个方法

1.2 局部对象AO/活动对象AO

函数被调用时产生,保存当前函数内部的执行环境。方法执行完后, 局部对象就消失

局部变量: 是局部对象的一个属性

局部函数: 是局部对象的一个方法

1.3 全局预编译

全局环境下(script标签下),js引擎的预处理方式

步骤

1. 生成GO对象(window对象)

2. 查找所有变量的声明,变量名作GO对象属性名,值为undefined

3. 查找所有函数的声明,函数名作GO对象属性名,属性值为function

同名的变量和函数,函数的优先级高

1.4 函数预编译

调用函数之前会做一个函数的预编译

步骤

        1. 调用那一刻,为函数生成一个AO对象

        2. 查找函数形参和局部变量的声明,作为AO属性名,值为undefined

        3. 实参值赋给形参

        4. 找到局部函数的声明,函数名作AO对象属性名,属性值为function

局部函数 > 实参 > 形参和局部变量

2. 作用域

2.1 全局作用域

script标签产生的区域,window对象管控的区域

全局的变量和函数浏览器关闭的时候销毁

2.2 局部作用域 function () { }

函数对象 管控区域

局部变量和函数 在函数执行完成后销毁

2.3 块级作用域 { let a = 1; }

if、for 管控的 {} 区域

let

2.4 作用域链

        内部可以访问外部

        使用数组存放,栈结构(上端进出,元素压栈进去,先产生的在下面)

        本质

                是一个数据结构,函数内部可以嵌套函数,每一次嵌套形成一个作用域,串起来就形成作用域链

                每个函数内部都的【scopes】属性,代表函数的作用域链,代表函数执行时所存在的执行环境(含每个作用域中的变量、局部函数)

                console.dir(a); //打印函数内部结构(含scopes属性)

                分别代表:

                                                        0 bAO
                                                        1 aAO
                                                        2 GO

        断点调试

2.5 变量取值原则

就近原则,当前作用域中没有 就找上一层,依次往上找,都没有就报错

3. 原型

实例成员 this添加的成员

静态成员 在构造函数本身上添加的成员,通过构造函数名访问

原型对象prototype: 构造函数的一个静态成员属性 Star.prototype

对象的原型: 对象的一个属性 ldh.__proto__

原型对象与对象的原型,指向同一个对象,都有一个属性constructor(指向构造函数本身)

原型链

概念

                实例对象的__proto__属性,指向的构造函数的原型对象。

(也是一个对象,也有__proto__属性),再一层一层往上找就形成原型链

作用

        1. 当实例对象调用方法,先在自身的this中的方法找
        2. 没有的话,通过__proto_找原型对象,看原型对象里有无定义
        3. 没有的话,通过原型对象的__proto__再到上一层
        4. 一直找到object都没有,则报错

        __proto__ 对象原型的存在,就是为对象成员的查找机制提供了一个方向

this指向

        构造函数和原型对象中的this 都指向当前创建的对象

应用(为js数组Array扩展sum方法)

Array.prototype.sum = function(){
  console.log(this); //this代表这个数组对象
    var total = 0
    for(var i=0; i<this.length; i++){//当前数组长度
        total += this[i]  //当前数组某个值
    }
    return total
}

4. 函数进阶

4.1 定义总结

  1. 命名函数 function f1() { }
  2. 匿名函数 var f2 = function () { }
  3. new Function(参数1,参数2,函数体)

        var f3 = new Function('num1','num2','console.log(num1+num2)')

4.2 调用总结

命名函数 函数名调用 function f1() { }

匿名函数 变量名调用 var f2 = function (){ }

对象的方法 对象

        var obj = { eat: function(){ } }
        obj.eat();

构造函数 对象

        function Student() { }
        var stu1 = new Student()

绑定事件函数 事件对象调用 btn.onclick = function(){ }

定时器函数 自动调用  setInterval(function(){ }, 1000)

立即执行函数 立即调用

        (function(num){
        console.log('ccc'+num);
        })(100)

4.3 this的指向总结

命名函数                 window

匿名函数                 window

对象的方法             实例对象

构造函数                 实例对象

构造函数和原型对象    实例对象

绑定事件函数         事件对象(事件所在的标签对象)this === e.target

定时器函数             window

立即执行函数         window

箭头函数                window

4.4 call

        可以调用函数 函数名.call()

        可以改变函数内this的指向

function add(num1, num2){
    console.log(this);
    console.log(num1 + num2);
}
var obj = { name:'张三', age:23 }
add.call(obj, 3, 4) //this变成了obj

4.5 高阶函数

        函数作为参数或者返回值 的函数

        案例

function f(num1, num2, fn){
    console.log(num1 + num2);
    fn && fn() //fn有值就调用(&&可短路,提高效率)
}
//调用函数
f(1, 2, function(){
    console.log('执行了fn');
})

5. 闭包

5.1 概念

是有权访问另一个函数作用域中变量的【函数】,延伸变量的作用范围
(一个作用域可以访问另外一个函数内部的局部变量)

5.2 应用(立即执行函数)

 for (var i = 0; i < lis.length; i++) {
   (function(i) {
     setTimeout(function() {
     console.log(lis[i].innerHTML);
     }, 3000)
   })(i);
}

6. let和const

let

        let不能重复声明

        防止循环变量变为全局变量

        let不会变量提升(有暂时性死区)

        let声明的变量只在所处于的块级有效

使用场景

        let一般用于定义变化的数据(基本数据类型)

        const一般用于定义引用数据类型

        优先选用const。如果数据后面要修改,就选用let

const

        不可以被修改

        无变量提升

        块级作用域

优先级:const > let > var

7. 类和继承

7.1 类

        class作为对象的模板,本质是function,也是ES6语法糖。

        可以通过 class 关键字定义类

7.2 继承

        class A extends B {}

7.3 静态属性、方法

        使用static修饰

        直接用类名调用

        工具类,全部用静态来写、类名调用,如Math

        例子        

class Student extends People{
    static graduation = "school";
    static speak() {}; //静态成员
    //构造函数
    constructor (name, age){
        this.name  = name;
        this.age = age;
    }
}
Student.speak(); //调用静态方法

8. 解构赋值

更方便的提取数组或对象的值

8.1 数组

const[变量列表] = 要解构的数组

var arr = [1, 2, 3];
var [num1, num2, num3] = arr;
console.log(num1, num2, num3);

8.2 对象

const{变量列表} = 要解构的对象

var obj = {
    name: "小明",
    age: 18,
};
var { name, age } = obj;
console.log(name, age);

8.3 别名

var { name: stuName, age: stuAge } = obj;
console.log(stuName, stuAge);

9. 箭头函数

(参数1, 参数2) => { 函数体 }

省略:参数 => 函数体

省略:参数 => 返回值

10. Promise

10.1 概念

  • 本质就是一个对象,有两个属性和一个方法
  • 状态属性、结果属性,then方法
  • 成功与否与接收值无关,与上一个promise调用的方法(第一个或第二个)中是否异常(出错)有关。如果上一个promise是第一个,只有reject,则认为是异常
  • then 方法将返回一个 resolved 或 rejected 状态的 Promise 对象。then的返回值为下一个then的参数

10.2 创建

const p = new Promise((resolve, reject) => {
    reject("promise的失败参数"); //失败
});
const then = p.then(
    (value) => { //前面成功,执行
        console.log("Promise成功:", value);
        return "then的成功参数";
    },
    (value) => { //前面失败,执行。执行出错则自己状态失败
        console.log("Promise失败:", value);
        return "then的失败参数"; //传递给下一个then的参数
    }
);

10.3 属性

状态属性 PromiseState

        默认值是 pending 准备状态,初始状态

        调用resolve()方法,可以将状态改成完成状态

        调用reject()方法,可以将状态改成拒绝状态

结果属性 PromiseResult

        默认值是 undefined

        调用方法的时候传一个参数,可以将参数保存在结果属性中

10.4 then方法

        接收两个函数,如果p的状态是成功的,就会调用第一个函数,如果是失败的,就会调用第二个函数

        then() 方法只有在状态发生改变的时候才会调用

        给 then 方法中的函数加一个参数,就可以拿到结果属性中的值

10.5 then返回值

        又是一个新的promise对象,可以继续调用then方法,进而实现链式编程

        链式编程能够执行的前提条件:第一个promise对象,状态不是pending,必须要发生改变

*. 使用

//管理(增删改)
function exec(sql) {
    return new Promise((resolve, reject) => {
        con.query(sql, (err, data) => {
            //有错,把失败的数据带回去
            if (err) reject(err);

            //将获取到的数据带回去
            resolve(data);
        });
    });
}
app.get("/users", async function(req, res) {
    let sql = 'select * from student';
    const data = await exec(sql);//执行SQL语句
    res.send(data);//发给浏览器
})

例题

2 2,var改为let,则 0 1

解释:

let:对应 console.dir(arr[0])

i 的值先到AO找,没有再到GO找

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43895819/article/details/126899284

智能推荐

微信查券机器人搭建_淘客机器人管理后台-程序员宅基地

文章浏览阅读519次。微信查券机器人搭建1、淘客机器人是什么?有什么价值?简单的说,淘客机器人是一个可以帮你赚钱的工具,它通过帮助用户查询商品的优惠券来获得官方联盟(一般指阿里妈妈、京东联盟、多多进宝等)的佣金。如果你想让更多的用户来使用你的机器人,可以返利一部分佣金给购买者,这样用的人越多,你就可以躺着赚钱了。参考2、公众号淘客机器人系统免费版:公众号淘客机器人自助搭建教程http://www.wlkankan.cn/cate50/221.html3、微信订阅号可以接入吗?可以,系统支持订阅号的的淘客机器人系统,_淘客机器人管理后台

深入浅出XDL(二):embedding_深入浅出embedding pdf-程序员宅基地

文章浏览阅读2.3k次。XDL(X-DeepLearning)是阿里巴巴开源的一款深度学习框架。官方介绍,此框架针对广告、推荐、搜索的场景做了很多优化。广告、推荐和搜索的模型,一个重要的特点是存在大量的稀疏特征,为此xdl提供了稀疏API:APIxdl.embedding计算单路稀疏特征的embeddingxdl.merged_embedding同时计算多路稀疏特征的embedding,..._深入浅出embedding pdf

告警处理子系统(SNET)-程序员宅基地

文章浏览阅读719次。《空中交通管制自动化系统最低安全高度告警及短期飞行冲突告警功能》(MH/T4022-2006) SNET将和MSDP部署在同一台服务器上。 SNET子系统读取共享内存中更新的多监视源融合数据(包括MS..._空管 ntz告警实现

c语言 json 请求_cJson的用法(一) -C语言解析/生成 json数据-程序员宅基地

文章浏览阅读120次。cJson这个库开源 跨平台,用来解析和生成json数据很方便。项目地址:https://github.com/DaveGamble/cJSON只需要把cJson.c,cJson.h拷进项目就ok. 下面直接上代码:#include#include#include"cJSON.h"int main(){/*************json的解析***************************..._c语言截取 jsondata

java rsa加密_数据加密、HTTPS、线上充值原理?看这篇就够啦-程序员宅基地

文章浏览阅读80次。专注于Java领域优质技术号,欢迎关注作者:肥朝内容大纲.png目的面试很多时候都会问一些通用的东西,比如多线程,比如数据加密,比如HTTPS,换句话说,无论你从事前端还是后端,数据加密和HTTPS都是必须掌握的数据加密首先,我们为什么要数据加密?因为HTTP所有访问都是明文的,只要能监听到网络所有的请求数据都是透明的,比如任何浏览器的开发者工具就能很清楚的看到表单提交的参数和地址,在Androi...

Android屏幕适配 全攻略 官方的 自己也再学习_adnroid屏幕适配学习-程序员宅基地

文章浏览阅读802次。Android屏幕适配出现的原因在我们学习如何进行屏幕适配之前,我们需要先了解下为什么Android需要进行屏幕适配。 由于近些年来,手机移动端的发展迅速,手机的品牌也在增多,这导致了设备碎片化、品牌碎片化、系统碎片化、传感器碎片化和屏幕碎片化的程度也在不断地加深。这也就是我们今天讨论的 屏幕的碎片化(屏幕适配)。详细的Android屏幕碎片化的数据我在这里就不列出来了,直_adnroid屏幕适配学习

随便推点

Flowable入门系列文章177 - 组信息的管理_flowable怎么关联自己的组-程序员宅基地

文章浏览阅读2.9k次。flowable入门、flowable现状、flowable开源产品、flwoable入门系列、flowable课程、flowable与activiti区别Flowable是用Java编写的轻量级业务流程引擎。Flowable流程引擎允许您部署BPMN 2.0流程定义(用于定义流程的行业XML标准),创建流程定义的流程实例,运行查询,访问活动或历史流程实例以及相关数据等等。本节将逐步介绍各种概念和API,通过您可以在自己的开发机器上进行的实例进行实现。_flowable怎么关联自己的组

java8 日期时间Api LocalDate、LocalTime、LocalDateTime_java8 季度-程序员宅基地

文章浏览阅读408次。1、LocalDate(1)构造通过字符串构造LocalDate stringParse = LocalDate.parse("2021-09-29");通过年月日构造LocalDate ofLocalDate = LocalDate.of(2021, 9, 29); // 年月日LocalDate ofLocalDate1 = LocalDate.ofYearDay(2021, 255); // 年 天数静态方法构造LocalDate nowLocalDate = Loca_java8 季度

python实训主要成果_完整word版,Python实训周总结-程序员宅基地

文章浏览阅读531次。Python实训周总结Python的学习到现在已经有半个月了,通过讲解与企业化标准的培训,使我加深了对python的认识。因为之前有学Java的基础,所以这次实训入门时也相对容易许多。这是我第一次接触到Python语言,但不是我学习的第一种编程语言。它的逻辑规则和C语言和JAVA存在很大的相似之处,在对数据进行处理时有种似曾相识之感。实习安排是逐渐加深的,所以跟随课程学习相对容易。Python是一..._python实训成果

文件对话框的使用-程序员宅基地

文章浏览阅读139次。一.OpenFileDialogOpenFileDialog dlg= new OpenFileDialog();1.对话框标题dlg.Title = "Open File";2.指定目录默认情况下,对话框将打开用户在上一次运行应用程序时打开的目录。设置InitialDirectory属性可以改变这种设置。注意:不要在应用程序中使用硬编码的目录字符串,因为该目录可能在用户的系统上不存在。..._dlg.addextension = true;

msdn下载的系统怎么安装_小鱼一键重装下载的系统在哪个盘-程序员宅基地

文章浏览阅读976次。1、msdn下载的系统怎么安装,首先在官网将win10系统iso镜像的下载链接通过下载工具,下载到非系统盘的分区当中。1、msdn下载的系统怎么安装,首先在官网将win10系统iso镜像的下载链接通过下载工具,下载到非系统盘的分区当中。有小伙伴们不知道安装msdn系统的具体操作,那么小编就教大家下载的系统怎么安装吧。有小伙伴们不知道安装msdn系统的具体操作,那么小编就教大家下载的系统怎么安装吧。小鱼一键重装系统v3.1.329.319。4、选择需要安装的系统,双击还原。4、选择需要安装的系统,双击还原。_小鱼一键重装下载的系统在哪个盘

ChatGPT与传统搜索引擎的区别:智能对话与关键词匹配的差异-程序员宅基地

文章浏览阅读891次,点赞3次,收藏3次。ChatGPT是一种基于人工智能的自然语言处理模型,由OpenAI开发。它的名字中的"GPT"代表"Generative Pre-trained Transformer",表明它是一个基于Transformer架构的预训练生成模型。ChatGPT的核心思想是通过大规模的文本数据预训练,使得模型能够理解和生成自然语言文本,从而可以用于问答、对话生成等任务。

推荐文章

热门文章

相关标签