JS预解析、对象

记住一句话:JavaScript语言是单线程的

 

同步异步:

 因为JavaScript的单线程,因此同个时间只能处理同个任务,所有任务都需要排队,前一个任务执行完,才能继续执行下一个任务,但是,如果前一个任务的执行时间很长,比如文件的读取操作或ajax操作,后一个任务就不得不等着,拿ajax来说,当用户向后台获取大量的数据时,不得不等到所有数据都获取完毕才能进行下一步操作,用户只能在那里干等着,严重影响用户体验

 

同步任务:

同步任务是指在主线程上排队执行的任务,只有前一个任务执行完毕,才能继续执行下一个任务

同步操作:从上到下,依次执行

 

异步任务:

 异步任务是指不进入主线程,而进入任务队列的任务,只有任务队列通知主线程,某个异步任务可以执行了,该任务才会进入主线程

异步操作:一般是耗时较多的操作,进入等待队列,当同步操作结束后执行

常见异步操作:AJAX请求,定时器

 

定时器:setTimeout(code,等待多长时间执行)(执行一次)

    setInterval(code,多长时间执行一次)(执行多次)

 

清除定时器

clearTimeout(定时器名)

clearInterval(定时器名)

所以创建定时器时 声明一个定时器名字,来接受定时器的返回值

例:

//60s验证码----------------------------------------------------------------------------------------
    var num = 60;
    // var str = "点击发送验证码";
    // console.log(str);
    alert("请点击发送验证码");
    var timer = setInterval(function(){
        num --;
        console.log(num+"s后重试");
        if(num<=1){
            clearInterval(timer);
            console.log("请重新点击发送验证码!");
        }
    },1000)
 
 
预解析:
(1)函数提升
(2)变量提升
(3)函数同名  同名的函数,后面的会覆盖前面的
(4)变量和函数同名
  当出现变量声明和函数同名的时候,只会对函数声明进行提升,变量会被忽略
(5)预解析是分作用域的
(6)函数表达式不会提升
 
作用域:
(1)全局作用域

  直接编写在 script 标签之中的JS代码,都是全局作用域;

  或者是一个单独的 JS 文件中的。

  全局作用域在页面打开时创建,页面关闭时销毁;

  在全局作用域中有一个全局对象 window(代表的是一个浏览器的窗口,由浏览器创建),可以直接使用。

(2)局部作用域(函数作用域)

在函数内部就是局部作用域,这个代码的名字只在函数的内部起作用

调用函数时创建函数作用域,函数执行完毕之后,函数作用域销毁;

每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。

将这样的所有的作用域列出来,可以有一个结构: 函数内指向函数外的链式结构。就称作作用域链。

 

(3)隐式全局变量

声明变量使用`var`, 如果不使用`var`声明的变量就是全局变量( 禁用 )

function foo () {

    var i1 = 1 // 局部

    i2 = 2, // 全局

    i3 = 3; // 全局

}

 

(4)作用域及作用域链

全局作用域---全局变量

 局部作用域---局部变量---只在当前作用域下有效

 块作用域?(js中没有)

只有函数才能产生局部作用域

 

作用域链的查找规则:

    先从当前的作用域中查找,如果有,就返回

    如果没有从上一级查找,有就返回,没有继续上一级查找,直到全局

    如果全局没有,就报错

 

对象:

JavaScript中的对象其实就是生活中对象的一个抽象。

JavaScript的对象是无序属性的集合。

其属性可以包含基本值、对象或函数。对象就是一组没有顺序的值。我们可以把JavaScript中的对象想象成键值对,其中值可以是数据和函数。

 

Tips:

事物的特征在对象中用属性来表示。

事物的行为在对象中用方法来表示。

 

对象创建方式:

1.对象字面量

 

var obj = {};

2.new Object()创建对象

 

var obj = new Object();

3.工厂函数创建对象

function Person(name,age){

  var per = new Objict();

  per.name = name;

  per,age = age;

return per;

}

var lisi = Person("李四","18")

 

//输出对象中的属性值

console.log(lisi.name)

console.log(lisi["name"])

4.自定义构造函数

 

function Person(name,age){

this.name = name;

this.age = age;

}

 

var per = new Person("张三",18)

 

 

属性和方法

1. 如果一个变量属于一个对象所有,那么该变量就可以称之为该对象的一个属性,属性一般是名词,用来描述事物的特征

2. 如果一个函数属于一个对象所有,那么该函数就可以称之为该对象的一个方法,方法是动词,描述事物的行为和功能

 

new  关键字

 

构造函数,是一种特殊的函数。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

1.、构造函数用于创建一类对象,首字母要大写。

2.、构造函数要和new一起使用才有意义。

new在执行时会做四件事情:

1、new会在内存中创建一个新的空对象

2、new会让this指向这个新的对象

3、new会返回这个新对象

 

对象的使用

遍历对象:

for(key in 对象名){

 console.log(对象名 .  属性名);

 console.log(对象名["属性名"]);

}

 

删除对象属性

delete  obj . 属性名 

 

posted @ 2021-11-24 20:31  ..Shmily  阅读(32)  评论(0)    收藏  举报