JavaScript的常用知识点 | 8月更文挑战

158 阅读2分钟

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

一、原型链

原型链涉及原型对象和原型链是如何产生的

1、原型对象

大部分的函数都有一个prototype属性,这个属性就算原型对象用来创建新对象的实例,新创建的对象也会又prototypr属性,因为都有prototype属性从而实现共享原型对象,所以这些对象都可以访问原型对象的属性。

let obj = {
    name: 'yumiao',
    age: '18'
}
console.log(obj.hasOwnProperty('name'));//true
console.log(obj.hasOwnProperty('hasOwnProperty'));//false
console.log(Object.prototype.hasOwnProperty('hasOwnProperty'));//true

obj.hasOwnProperty();//这个方法就是在Object的原型对象中,可以被任何对象当作自己的方法使用

上面的hasOwnProperty并不在Obj对象中但是可以访问,说明对象中是通过原型链拿到的方法

2、原型链

把对象打印出来的话,可以看到每个对象都有一个_proto_属性,这个属性就指向构造函数constructor的原型。每个对象可以通过这个属性和上游的构造函数的原型对象连接起来,而上游对象也有_proto_属性,这样就好像产生了一个闭环,就是原型链。

二、闭包

闭包是函数和声明函数的词法环境的组合,常规理解就算函数体内可以访问的变量的总和,不要是一个函数里套着一个函数啦。

(function() {
    let a = 1;
    function calculate() {
        let b = 2;
        let total = a+b;
        console.log(total);
    }
    calculate();//可以访问内部变量a,组合在一起就是闭包});

闭包可以隐藏变量,因为内部函数可以访问外部函数的变量,即使外部函数被return之后。

三、JavaScript的变量提升

js引擎的工作方式是先解析代码,获取所有被声明的变量,然后一行一行的运行代码。其中每行定义变量的语句会被先放到代码头部执行,就是变量提升。

console.log(1,a);//undefined
var a = 1;
function b() {
    console.log(2,a);//1
}
b();

其中第一行打印出来是undefined,是因为代码是这样执行的:

var a = undefined;
console.log(1,a);
a = 1;
function b() {
    console.log(2,1);
}
b();

把var a = 1提升到代码第一行,并且默认赋值未undefined,然后a=1还是在原来的位置,所以第一次打印出来a是undefined,后面就是一行一行执行。

enmmm,每天学习一点点,每天进步一点点,天天向上!