美文网首页
【javaScript练习】2021-02-23

【javaScript练习】2021-02-23

作者: pumpkin1024 | 来源:发表于2021-02-23 17:22 被阅读0次

javaScript

  1. 作用域,异步执行,requestAnimationFrame
// 5 5 5 5 5 为什么是5不是4?当i=5时跳出循环
// var存在变量提升
for(var i = 0; i < 5; i++){
    requestAnimationFrame(() => console.log(i));
}
// 改成let,结果不一样 0 1 2 3 4
for(let i = 0; i < 5; i++){
    requestAnimationFrame(() => console.log(i));
}
  1. 微任务,宏任务,异步执行
// 1 3 5 4
console.log(1);
// 宏任务 后执行
let a = setTimeout(() => {console.log(2)}, 0);
console.log(3);
Promise.resolve(4).then(b => {
    // 微任务 先执行
    console.log(b);
    clearTimeout(a);
});
console.log(5);
  1. Array方法

会改变数组的方法:

push()

pop()

shift()

unshift()

splice()

sort()

reverse()

forEach()

不会改变数组的方法:

filter()

concat()

slice()

map()

  1. 阻止默认事件 阻止冒泡

阻止默认事件:

e.preventDefault()

e.returnValue = false (IE)

阻止冒泡:

e.stopPropagation()

e.cancelBubble = true (IE)

  1. 函数的this this原理
// 输出window.location
function Foo(){
    console.log(this.location);
}
Foo();
  1. 变量提升 函数提升
  1. js有变量提升和函数提升,用var声明变量或用 function 函数名(){ } 声明的会在js预解析阶段提升到顶端(es6的let和const不会提升)
  2. 函数提升优先级 高于 变量提升
  3. 相同作用域时声明变量而不赋值则还是以前的值, 而子作用域声明不赋值则函数内该值为undefined,因为声明了私有变量
var A = 1;
function A(){};
console.log(A);// 1

function A(){};
var A;
console.log(A);// A还是function 第3点提到的
  1. 正则表达式\1的意思
  2. call

正确答案是B。
这道题看似在考this的绑定问题,实际上是通过this绑定为幌子,考察非严格模式下JavaScript语句中“this”默认指向全局对象(window)。
题目的关键点在第3行,我们知道,this绑定的优先级是new>bind>call(apply)>obj.func()>默认绑定。也就是说obj.log.call(console, this)语句中,实际上log函数内的this实际上指代的是console(这也是本题最大的陷阱!)。然而实际上这一语句中obj.log.call(console, this)这一语句中打印的this是在外部传进去的,和函数内的this对象根本没有关系!也就是说此时log函数内的this指代console,但是打印的是从外面传进去的this对象,也就是window!
为了证明这一点,读者朋友们可以把obj.log.call(console, this)中的console改成任意一个对象,然后在非严格模式下执行,会发现结果都是window。

var obj = {};
obj.log = console.log;
obj.log.call(console,this);
  1. js 精度问题 0.1 + 0.2 != 0.3
  2. Reg.exec();
  3. 事件冒泡

不冒泡事件</br>
妈(mouseenter)妈(mouseleave)不(blur)放(focus)心你(unload)的日(resize)子了(load)

12.JavaScript实现继承共6种方式:
原型链继承、借用构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承。

  1. this 上下文学习链接
  • 全局执行上下文: 这是默认的、最基础的执行上下文。不在任何函数中的代码都位于全局执行上下文中。它做了两件事:1. 创建一个全局对象,在浏览器中这个全局对象就是 window 对象。2. 将 this 指针指向这个全局对象。一个程序中只能存在一个全局执行上下文。
  • 函数执行上下文:(this) 每次调用函数时,都会为该函数创建一个新的执行上下文。每个函数都拥有自己的执行上下文,但是只有在函数被调用的时候才会被创建。
var obj = {a:1,b:function () {alert(this.a)}}; 
var fun = obj.b; 
// 等同于 var fun = function () {alert(this.a)}
console.log(fun()) // undefind this指向window

var user = {
 count : 1,
 getCount: function(){
  return this.count;
 }
}
var func = user.getCount
console.log(func()) // undefind this指向window
// 改成let呢?
for(var i = 0; i < 5; i++){
    setTimeout(function(){
        console.log(i);
    }, 1000 * i);
}
  1. 变量声明提升 赋值不会提升 </br> 函数声明提升优先级大于变量声明提升 因此函数声明覆盖变量声明
var b = 3;// 全局作用域
// IIFE 立即调用函数表达式
(function(){
    // 函数作用域
    b = 5;
    var b = 2;// 只在函数内部提升
})();
console.log(b);// 3 全局作用域无法访问函数作用域
  1. 魔鬼闭包
function fun(n,o) {
  console.log(o)
  return {
    fun:function(m){
      return fun(m,n);
    }
  };
}
var a = fun(0); 
a.fun(1); a.fun(2);  a.fun(3);//undefined,0,0,0
var b = fun(0).fun(1).fun(2).fun(3);
//undefined,0,1,2
var c = fun(0).fun(1);
c.fun(2); c.fun(3);
//undefined,0,1,1
  1. Event loop 宏任务微任务
    详解

宏任务:
script全部代码、setTimeout、setInterval、setImmediate(浏览器暂时不支持,只有IE10支持,具体可见MDN)、I/O、UI Rendering。

【记忆:一个U(UI Rendering)I(I/O)工程师在4S店】



微任务:
Process.nextTick(Node独有)、Promise、Object.observe(废弃)、MutationObserver

console.log('script start');
setTimeout(function() {
  console.log('setTimeout');
}, 0);
new Promise((resolve)=>{
    resolve();
    console.log("new Promise");
}).then(function() {
  console.log('promise1');
}).then(function() {
  console.log('promise2');
});
console.log('script end');
// script start
// new Promise
// script end
// promise1
// promise2
// setTimeout
// 执行顺序 
// script -> Promise callback -> setTimeout callback
console.log('script start')
async function async1() {
  await async2()
  console.log('async1 end')
}
async function async2() {
  console.log('async2 end') 
}
async1()
// async await 是Promise的语法糖
// 可以转换成
// new Promise((resolve)=>{
//     console.log('async2 end');
//     resolve();
// }).then(()=>{
//   console.log('async1 end')
// })
setTimeout(function() {
  console.log('setTimeout')
}, 0)
new Promise(resolve => {
  console.log('Promise')
  resolve()
})
  .then(function() {
    console.log('promise1')
  })
  .then(function() {
    console.log('promise2')
  })

console.log('script end')

相关文章

网友评论

      本文标题:【javaScript练习】2021-02-23

      本文链接:https://www.haomeiwen.com/subject/ytqdfltx.html