JavaScript —— this、闭包、原型、异步

转载自 水歌博客,方便学习,顺便前排观望大佬!


JavaScript 是一门原生支持函数式编程范式的、基于原型的面向对象语言,也是一门弱类型动态脚本语言

What’s this ?

JavaScript 函数的 this 是由函数调用者在调用前确定的 —— 继承自 LISP 语言

用 ECMAScript 6 解释如下:

调用方式调用者等效代码
func(...params)JS 引擎func.apply(null, params)
obj.func(...params)一个对象func.apply(obj, params)
new func(...params)new 运算符func.apply(Object.setPrototypeOf({ }, func.prototype), params)
element.onclick = funcDOM 事件回调func.call(element, event)

上述最后一种其实是运行时 API 级别的,与语言本身无关,用 JS 写的公共库需要回调函数时,也是库内部调用时如上手动指定的。

闭包

通俗解释:

孩子靠着自创资产和自己可掌控的父母遗产,继续活下去

技术解释:

局部作用域中创建的函数,若引用了其上级作用域中的变(常)量,又在上级作用域外有引用,上级作用域执行结束被销毁时,此函数及其引用的数据形成一个不被销毁的闭包

—— 继承自 LISP 语言

var closure = function () {

    const privateData = { };

    return {
        set:  function (key, value) {

            privateData[key] = value;
        },
        get:  function (key) {

            return privateData[key];
        }
    };
};

closure.set('A', 1);

console.log( closure.get('A') );    //  1
复制代码

闭包在 ECMAScript 5 及更早的时代,常用于模拟块级作用域模块作用域,在 ECMAScript 6 引入这两种新局部作用域后,它们又成了形成闭包的上级作用域之一。

原型

基于原型的面向对象语言 可看作把 基于类的面向对象语言运行时内部构造 开放了出来

原型
对象的创建class 的构造函数修饰 this直接 new 一个函数作为构造函数
对象的继承只知其然,不知所以然对象内部引用构造函数的原型对象,在引用对象未定义成员时,在原型上找同名成员
类的继承只知其然,不知所以然Child.prototype = new Parent()
私有成员只知其然,不知所以然局部作用域“对外不可访问性”保存的私有 Symbol(运行时唯一值)命名对象成员

异步

异步函数先记下要做什么(传入的参数、回调函数)并交给 JS 引擎所在运行时平台的其它线程,然后立马返回,让 JS 自身线程继续执行完后面的同步代码,再按异步任务完成的顺序,一一用相应结果数据调用回调函数

所有的异步任务内部都基于回调函数实现:

function asyncFunc(callback) {

    setTimeout(callback, 1000);
}

asyncFunc(function () {

    console.log('See you later')
});
复制代码

但需要回调函数的不一定是异步任务:

function syncFunc(callback) {

    console.log('See you ' + callback());
}

syncFunc(function () {

    return 'now';
});复制代码


转载于:https://juejin.im/post/5c979679f265da61173a3c52

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值