JavaScript语言精粹

JavaScript严格模式

"use strict" 指令在 JavaScript 1.8.5 (ECMAScript5) 中新增。目的是指定代码在严格条件下执行。
严格模式经过在脚本或函数的头部添加 use strict; 表达式来声明。
ESM中的模块默认都是严格模式。html

为何使用严格模式:
消除Javascript语法的一些不合理、不严谨之处,减小一些怪异行为;* 消除代码运行的一些不安全之处,保证代码运行的安全;算法

  • 提升编译器效率,增长运行速度;
  • 为将来新版本的Javascript作好铺垫。

"严格模式"体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。浏览器

严格模式的限制:
一、不容许使用未声明的变量: a = 3;
二、不容许删除变量:delete a安全

**`delete` 操做符**用于删除对象的某个属性。若是对象包含该属性,那么该属性就会被移除。它不会触及原型链中的任何对象。删除对象的属性可能会让来自原型链中的属性透现出来。
 
 在严格模式下,若是对一个变量的直接引用、函数的参数或者函数名使用delete操做,将会抛出语法错误([`SyntaxError`]。所以,为避免严格模式下的语法错误,必须以`delete object.property`或`delete object['property']`的形式使用delete运算符。
 
 与一般的见解不一样,`delete`操做符与直接释放内存**无关**。内存管理 经过断开引用来间接完成。

三、不容许变量重名:
四、因为一些安全缘由,在做用域 eval() 建立的变量不能被调用:eval ("var x = 2"); alert (x);
五、.....完整内容点击标题连接......ide

JavaScript垃圾回收

引用
垃圾回收算法主要依赖于引用的概念。在内存管理的环境中,一个对象若是有访问另外一个对象的权限(隐式或者显式),叫作一个对象引用另外一个对象。例如,一个Javascript对象具备对它原型的引用(隐式引用)和对它属性的引用(显式引用)。函数

在这里,“对象”的概念不只特指 JavaScript 对象,还包括函数做用域(或者全局词法做用域)。ui

引用计数垃圾收集算法
这是最初级的垃圾收集算法。此算法把“对象是否再也不须要”简化定义为“对象有没有其余对象引用到它”。若是没有引用指向该对象(零引用),对象将被垃圾回收机制回收。this

限制:循环引用prototype

function f(){
  var o = {};
  var o2 = {};
  o.a = o2; // o 引用 o2
  o2.a = o; // o2 引用 o

  return "azerty";
}

f();

该算法有个限制:没法处理循环引用的事例。在下面的例子中,两个对象被建立,并互相引用,造成了一个循环。它们被调用以后会离开函数做用域,因此它们已经没有用了,能够被回收了。然而,引用计数算法考虑到它们互相都有至少一次引用,因此它们不会被回收。插件

标记-清除算法
这个算法把“对象是否再也不须要”简化定义为“对象是否能够得到”。

这个算法假定设置一个叫作根(root)的对象(在Javascript里,根是全局对象)。垃圾回收器将按期从根开始,找全部从根开始引用的对象,而后找这些对象引用的对象……从根开始,垃圾回收器将找到全部能够得到的对象和收集全部不能得到的对象。

这个算法比前一个要好,由于“有零引用的对象”老是不可得到的,可是相反却不必定,参考“循环引用”。

从2012年起,全部现代浏览器都使用了标记-清除垃圾回收算法。全部对JavaScript垃圾回收算法的改进都是基于标记-清除算法的改进,并无改进标记-清除算法自己和它对“对象是否再也不须要”的简化定义。

Javascript中的基本数据类型:数字,字符串,逻辑类型,undefined,object, function
若是不考虑js的面向对象部分,JS是够简单的。

JavaScript面向对象
典型案例代码一:
一、编写图片有序、无需排序预加载插件:

(function($) {
  function Preload(imgs, options) { // ES5形式定义类
    // 至关于JAVA中类的成员属性和方法
    this.imgs = (typeof imgs === 'string') ? [imgs] : imgs;
    this.opts = $.extend({}, Preload.DEFAULTS, options)
    // 约定:下划线_开头的方法为内部使用,不提供外部调用
    if('ordered' === this.opts.order ) {
      this._ordered(); // 有序预加载
    } else {
      this._unordered(); // 无序预加载
    }    
  }
  
  // 至关于JAVA中类的静态成员属性和方法,类的实例对象共享,能够经过类名调用
  Preload.DEFAULTS = {
    order: 'unordered', // 插件默认设置
    each: null, // 每一张图片加载完毕后执行
    all: null // 全部图片加载完毕后执行
  }
  
  // 无序预加载方法
  Preload.prototype._unordered = function () {
    var imgs = this.imgs,
        opts = this.opts, 
        count = 0
    // 无序加载
    $.each(imgs, function(i, src) {
        var img = new Image()
        $(img).on('load error', function() {
          count++
          opts.each && opts.each() // 先判断传参是否空
          if(count >= imgs.length-1) {
            opts.all && opts.all() // 先判断传参是否空
          }
          ...
        })
        img.src = src
    })
  }
  
  // 有序预加载方法
  Preload.prototype._oderded = function () {
     var imgs = this.imgs,
         opts = this.opts,
         count = 0
     load()
     // 有序加载
     funciton load() {
        var img = new Image()
        $(img).on('load error', function() {
          count++
          opts.each && opts.each() // 先判断传参是否空
          if(count >= imgs.length-1) {
            opts.all && opts.all() // 先判断传参是否空
          } else {
            load()
          }
        })
        img.src = imgs[count]
     }   
        
  }
  
  // 写成jQuery插件
  $.extend({
    preload: function(imgs, opts) {
      new Preload(imgs, opts)
    }
  })
})(jQuery);

调用:$.preload(['https://xx.gif', ''], { 'ordered', function() {}, function() {} })

jQuery插件两种形式:$.fn.extend -> $('#img').preload() // 挂载到jQuery.fn上,调用时能够选择元素后调用$.extend -> $.preload() // 直接挂载到jQuery上,不须要选择元素

相关文章
相关标签/搜索