javaScript原生复习

一、函数的定义方式

1. 函数声明:
function 函数名() {
   //...
}

特点:无论在函数定义前,还是函数定义后调用,都能执行
为什么都能执行???
因为函数声明方式:函数提升
2.函数表达式:
var 变量名=function() {
   //....
}
变量名()
特点:只能在函数定义后调用,才能执行

二、this指向问题

1、普通函数this指向
函数的this指向遵循一个基本原则:谁调用的函数,函数的this就指向谁,否则指向全局
2、箭头函数this指向
先我们要知道,箭头函数本身是没有 this,箭头函数 this 是定义箭头函数时父级作用域的 this,也就是说使用箭头函数时,箭头函数内部的 this,我们只需要看定义该箭头函数时,该箭头函数父级的 this
3、使用call、apply指定this
call和apply的功能一样,只是参数不同。call是列举出所有参数,而apply是以将参数放入数组,以数组的形式传递。

三、new 函数,访问原型上方法

今天小编做了一道针对this指向比较绕的题,javaScript不熟练的要多看,多练习,题目如下:

题目一:

//定义一个Foo函数
function Foo() {
 getName = function () { alert(1) };
 return this;
}
Foo.getName = function () { alert(2) };
Foo.prototype.getName = function () { alert(3) };
//函数表达式
var getName = function () { alert(4) }
//函数声明
function getName() { alert(5) }
请写出输出结果:
Foo.getName() 
getName() 
Foo().getName() 
getName()  
new Foo.getName()  
new Foo().getName() 
new new Foo().getName() 

注:题目的答案小编放到博客结尾,可以参照对比。

四、javaScript异步

1、同步和异步的区别

js是单线程的,只能处理完一件事再做另外一件事,但是设想如果前面一件事花费的时间特别长,我们就只能一直等着他,就会阻塞下面的进程,这样程序运行时间增长,就会降低用户体验。
同步:按照一定的顺序去执行,执行完一个才能执行下一个
异步:执行顺序是不确定的,由触发条件决定,什么时间执行也是不确定的,即使是定时器,异步处理可以同时执行多个。

注:异步的应用场景

1.数据请求(ajax)
2.DOM操作:例如:点击事件
3. 定时器操作:setTimeout,setInterval

管理异步

1.回调函数
2.Promise
3.async/await

这道题是针对javaScript同步异步的一道题目,答案也会放到博客结尾,题目如下:

async function async1(){
    console.log('async1 start')   
    await async2() 
    console.log('async1 end')    
}
async function async2() {
    console.log('async2')       
}
console.log('script start')    

setTimeout(() => { 
    console.log('setTimeout')   
});

async1()

new Promise((resolve=>{
    console.log('promise1')  
    resolve()
})).then(function () { 
    console.log('promise2')  
})
console.log('script end')     
根据题目看后台先输出哪一个?

注:异步:分宏任务代码和微任务代码(详细了解查一下event loop)

宏任务:

setTimeout
setInterval
setImmediate (Node独有)
requestAnimationFrame (浏览器独有)
I/O
UI rendering (浏览器独有)

微任务:

process.nextTick (Node独有)
async/await
Promise
Object.observe
MutationObserver

第一题答案:

Foo.getName() //打印出2
getName()  //打印出4
Foo().getName()  //打印出1
getName()  //打印??? 1
new Foo.getName()  //打印???2
new Foo().getName()  //打印?? 3
new new Foo().getName()  //打印??3

第二题答案:

运行结果:
1. script start
2. async1 start 
3. async2
4. promise1
5. script end
6. async1 end
7. promise2
8. setTimeout
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值