FrankFan / blog

blog
http://frankfan.github.io/blog/
2 stars 0 forks source link

JavaScript 基础 #3

Open FrankFan opened 5 years ago

FrankFan commented 5 years ago

JavaScript 基础

1. JavaScript的数据类型

2. 闭包closure

3. 作用域和作用域链

JS的作用域指的是变量的作用范围,内部作用域由函数的形参、实参、局部变量以及函数构成,内部作用域和外部作用域一层层的链接起来形成作用域链,当在函数内部要访问一个变量时,首先查找函数自己内部作用域有没有这个变量,如果没有就到这个对象的原型中去查找,如果还是没有的话,就到该作用域所在的作用域中找,直到window所在的作用域,每个函数在声明的时候就默认有一个外部作用域存在了,比如:

   var t = 4;
   function foo() {
       var tmp = 12;
       function bar() {
           var tmp = 34;
           console.log(t+' '+' '+tmp);
       }
   }

bar找t变量的过程就是,先到自己的内部作用域中找,发现没有找到,然后到bar所在的最近的外部变量中找,也就是foo的内部作用域,还是没有找到,再到window的作用域中找,结果找到了。

4. call和apply

5. 继承()

先定义一个A,

   function A(name){
       this.name = name;
   }
   A.prototype.sayName = function() {
       return this.name;
   }

6. JS变量提升

请看下面代码

   var bar = 1;
   function test() {
       console.log(bar); // undefined
       var bar = 2;
       console.log(bar); // 2
   }
   test();

为什么在test函数中会出现上述结果呢,这就是JavaScript的变量提升了,虽然变量bar的定义在后面,不过浏览器在解析的时候,会把变量的定义放到最前面,上面的test函数相当于:

   var bar = 1;
   function test() {
       var bar;
       console.log(bar); // undefined
       bar = 2;
       console.log(bar); // 2
   }
   test();

再看一个例子:

   var foo = function() { console.log(1);}
   function foo() {
       console.log(2);
   }
   foo(); // 1
   // 同样的,函数定义也会提升到最前面,上面的代码相当于
   var foo;
   function foo() {console.log(2);}
   foo = function() { console.log(1);}
   foo(); // 1

  1. 事件模型、事件绑定、委托机制

  2. 内存泄漏与垃圾回收

  3. 跨域

  4. 同源策略

  5. Web安全

    • XSS​
    • CSRF

12. 前端性能优化(提高网页加载速度,降低白屏率)

- 总的原则:减少请求,减小体积
- 使用CSS Sprites,可以减少image请求数
- 使用CDN,减小服务器负担
- 预加载css、js,懒加载图片
- 压缩js、css、img文件,减小文件体积

13. Promise

function loadImageAsync(url) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.onload = function() {
      resolve();
      console.log('load success');
    }
    img.onerror = function() {
      reject(new Error(`Could not load image at ${url}`));
      console.log('load fail');
    }
    img.src = url;
  });
}

loadImageAsync('https://www.baidu.com/img/bd_logo1.png')
  .then(_ => {
    console.log('load success');
  })
  .catch(err => {
    console.log(`error occured ${err}`);
  })

例子

  1. 给字符串定义一个 repeatify 功能,当传入一个整数n时,会返回重复n次的字符串的结果。 例如:
    console.log('hello'.repeatify(3)); // 输出 hellohellohello

if (!String.prototype.repeatify) {
  String.prototype.repeatify = function(count = 1) {
    let result = '';
    let currentValue = this.toString();
    for (let i = 0; i < count; i++) {
      result += currentValue;
    }
    return result;
  };
}