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个特殊的引用类型:Boolean
、Number
、String
的存在。
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; // 销毁实例
Number
和Boolean
同理。
原型
function foo(){
// do something
}
// 原型
foo.prototype.test = function(){
// do something
};
// 重写原型
foo.prototype = {
test: function(){
// do something
}
}
- 每个函数都有一个
prototype
属性,它指向一个对象,这个对象我们暂且称为PT
-
PT
会有一个constructor
属性,指向原函数
重写原型的问题是
-
PT
的constructor
会指向Object
构造函数 - 无法通过
constructor
确定对象类型 - 切断了实例与最初原型的联系,所以不能在重写原型之前实例化
闭包
function closure(){
return function(){
// do something
}
}
var _closure = closure(); // closure 执行环境的作用域链已经被销毁,但是活动对象仍然在内存中
_closure = null; // 销毁活动对象
活动对象
即变量
网友评论