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
<script type="module">
  //import './hello.js';
  import {a} from './hello.js';
</script>

在hello.html中虽然进行了导入,但还不能使用. 需要导入变量 import {a} from ‘./hello.js’

如果多次重复执行同一句import语句,那么只会执行一次,而不会执行多次。