javascript高级 ============== 变量 ------- 如果变量未声明直接赋值,则直接赋值,则会直接声明一个全局变量,并且为windows对象所有 :: num = 100; 全局声明的变量,为windows对象所有 :: var a = 20; console.log(window.a); 对象 ------- JavaScript没有像许多面向对象的语言一样有用于创建class类的声明。JavaScript 用一种称为构造函数 的特殊函数来定义对象和它们的特征。 构建函数提供了创建您所需对象(实例)的有效方法,将对象的数据和特征函数按需联结至相应对象。 :: function Person(name) { this.name = name; this.greeting = function() { console.log("Hi! I'm " + this.name + "."); }; } var person1 = new Person('Bob'); var person2 = new Person('Sarah'); * this表示当前对象。 * new 来创建对象。 * 隐式返回 this 对象。 * 构造函数约定首字母大写(非强制)。 一种常见的对象定义模式是,在构造函数(函数体)中定义属性、在 prototype 属性 上定义方法。如此,构造器只包含属性定义,而方法则分装在不同的代码块,代码更具可读性。例如 :: // 构造器及其属性定义 function Ract(a,b,c,d) { // 属性定义 }; // 定义第一个方法 Ract.prototype.x = function () { ... } // 定义第二个方法 Ract.prototype.y = function () { ... } 通过Object创建对象 :: var obj = new Object() obj.name = "bjbook" obj.age = "19" Promise 对象用于表示一个异步操作的最终完成(或失败)及其结果值。 闭包 ----- 函数返回函数,然后可以访问外层函数的变量。 闭包应用如下: * 实现共有变量,例如函数调用次数统计 * 模块化开发,防止污染全局变量。 * 实现封装,属性私有化。 继承 ------ 原型链 命名空间 ----------- 如果多部门合作,为了避免冲突,就需要命名空间。 webpack for in this ------- * 全局作用域this代表window. * call/apply改变this指向。 * obj.fn(),则 fn里面的this代表obj。 with ----- with改变程序执行的上下文 :: with (document){ write("hello world"); write("hello beijing"); } ES5.0的严格模式下不能使用,因为可能影响性能。例如以下情况 :: with (document){ write("hello world"); write("hello beijing"); } arguments ----------- arguments表示函数的参数列表。 * length 参数个数。 * callee 函数本身,指向参数的函数的引用。 * caller, 被调用的函数。不建议使用该特性。 例如立即执行函数, 如果有递归调用,可以使用callee来进行递归调用。 function test(){ console.log(arguments.callee); function demo(){ console.log(arguments.callee); } demo(); } test(); try...catch ----------- try...catch语句标记要尝试执行的语句块,并指定捕获一个出现异常,然后进行 相应处理。try内部代码不再执行,不影响后续代码的执行。 :: try { console.log("hello"); console.log(a); console.log("world"); }catch(e) { console.log(e.name + ":" + e.message); } console.log("beijing") 错误类型 ---------- 1, Reference Error ES5.0 ---------- ES5.0的全称为ECMAScript 5, 它是ES3.0的后续版本。 ES5.0默认和ES3.0兼容, 但它有一个严格模式,限制了ES3.0的某些语法。 严格模式用于消除Javascript语法的一些不严谨的地方,减少一些编程的怪异用法。 严格模式,使用"use strict" 指令,必须在全局或函数的第一条语句定义’use strict’。 * 不能使用未声明的变量,即变量必须加关键字var 进行声明。 * 自定义的函数中的this默认为undefiled, 非严格模式默认为window. * 不能使用arguments的callee,caller等属性。 * 不能使用with语句。 * 不允许删除函数。 // todo 举例。 ES6 ----- ES6提供了通用的模块化方案:ES6专门提供了import和export两个关键字 export 是用来定义模块的,可以导出对象、函数、类、字符串等等 :: //hello.js export const a = 1; console.log(a); // hello.html 在hello.html中虽然进行了导入,但还不能使用. 需要导入变量 import {a} from './hello.js' 如果多次重复执行同一句import语句,那么只会执行一次,而不会执行多次。