8月28日学习笔记

8月28日学习笔记

JavaScript基础:

变量提升:

JavaScript引擎的工作方式是先解析代码,获取所有被声明的变量再一行行运行。造成所有变量的声明语句都会提升到代码的头部,称作变量提升

1
2
3
4
5
console(a)//=>undefined
var a=1
function b(){
console.log(a);//=>1
}

在这段代码中,实际的执行顺序如下:

  1. 引擎将var a=1拆解为var a=undefined和a=1,并将var a=undefined放到代码头部,a=1在原位
  2. 当程序执行时,从上往下一行行执行,就造成了当前结果,这就叫变量提升

闭包:

闭包是函数和声明该函数的词法环境的组合
即:闭包等于函数及函数体内可访问变量的总和

例如:

1
2
3
4
5
6
7
8
9
(function(){
var a=1;
function add(){
var b=2;
var sum=b+a
console.log(sum);
}
add()
})()

add函数本身以及内部可访问的变量(a=1),这两者组合在一起即称作闭包

作用:

闭包最大的作用在于隐藏变量

闭包的一大特性就是内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在外部函数被返回(寿命终结)之后

基于此,JavaScript可以实现私有变量、特权变量、储存变量等

私有变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Person(){
var name='xiaomin';
this.getName=function(){
return name;
}
this.setName=function(value){
name=value;
}
}
const xiaomin=new Person();
console.log(xiaomin.getName());//=>xiaomin
xiaomin.setName('xiaoqiang');
console.log(xiaomin.getName());//=>xiaoqiang
console.log(name);//=>undifined

在这段代码中,函数体内的name只有getName和setName两个函数可以访问,而外部无法访问,相当于函数的私有变量。


原型链:

原型对象:

绝大部分函数都有一个prototype属性,这个属性是原型对象用来创建新对象实例,而所有被创建的对象都共享原型对象,因此这些对象可以访问原型对象的属性

例如hasOwnProperty()方法存在于Object原型对象中,它可以被任意对象当作自己方法调用。
用法:object.hasOwnProperty( propertyName ) 如果对象有名称为prototypeName的属性,返回true否则返回为false
例如:

1
2
3
4
5
6
var person={
name:'xiaomin',
age:29,
sex:'male'
};
console.log(person.hasOwnProperty("name"));//=>true

从这可以看出来,虽然hasOwnPrototype()不存在person对象中,但是它仍然可以调用此方法,而person对象找到Object对象中的方法靠的就是原型链。

原型链:

每个对象都有_proto_属性,此属性指向对象的构造函数的原型

对象可以通过_proto_与上游的构造函数连接起来,而上游的的原型对象也拥有一个_proto_,这样就形成了原型链。
如图所示: