"use strict" 指令在 JavaScript 1.8.5 (ECMAScript5) 中新增。目的是指定代码在严格条件下执行。
严格模式经过在脚本或函数的头部添加 use strict; 表达式来声明。
ESM中的模块默认都是严格模式。html
为何使用严格模式:
消除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 对象,还包括函数做用域(或者全局词法做用域)。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上,不须要选择元素