Javascript的一些原理

2016/05/11
整理一些ECMAScript 5容易忽视的概念。

函数

定义

foo();
// 函数声明
function foo(){
  // do something
};
foo();

因为解析器“函数声明提升”(function declaration hositin),所以任何位置都可以调用函数

foo(); // 错误
// 函数表达式
var foo = function(){
  // do something
};
foo();

因为解析器“变量声明提升”,如果在var之前调用会报错,因为只声明未赋值

执行

让定义的函数立即执行:

// 函数声明
(function(){
  // do something
})();
// 函数表达式
var foo = function(){
  // do something
}();

基本包装类型

基本类型的值可以调用方法,是因为3个特殊的引用类型:BooleanNumberString的存在。

var str = 'Counter Seven'; // 基本类型
var substr = str.substring(2);

变量str不是对象,但可以调用substring方法,因为解析器在第2行顺序str做了以下操作:

var str = new String('Counter Seven');  // 创建`String`类型的实例
str.substring(2);                       // 在实例上调用`substring`方法
str = null;                             // 销毁实例

NumberBoolean同理。

原型

function foo(){
  // do something
}

// 原型
foo.prototype.test = function(){
  // do something
};

// 重写原型
foo.prototype = {
  test: function(){
    // do something
  }
}
  • 每个函数都有一个prototype属性,它指向一个对象,这个对象我们暂且称为PT
  • PT会有一个constructor属性,指向原函数

重写原型的问题是

  1. PTconstructor会指向Object构造函数
  2. 无法通过constructor确定对象类型
  3. 切断了实例与最初原型的联系,所以不能在重写原型之前实例化

闭包

function closure(){
  return function(){
    // do something
  }
}
var _closure = closure(); // closure 执行环境的作用域链已经被销毁,但是活动对象仍然在内存中
_closure = null; // 销毁活动对象

活动对象变量

你可能感兴趣的:(Javascript的一些原理)