1.立即调用函数表达式
函数会创建新的变量作用域,不会影响函数外的变量
var a = 42;
(function life(){
var a = 10;
console.log(a);
})(); //10
a; //42
复制代码
2.闭包
可以将闭包看做‘记忆’并在函数运行完毕后继续访问这个函数的作用域(其变量)的一种方法。
function makeAdder(x) {
function add(y) {
return y + x
}
return add;
}
var plusOne = makeAdder(1)
var plusTen = makeAdder(10)
plusTen(3) //13
plusOne(5) //6
plusOne(6) //7
复制代码
3.模块
闭包最常见的应用是模块模式。模块允许你定义外部不可见的私有实现细节(变量、函数),同时也可以提供允许从外部访问的公开API。
function User(){
var vsername, password;
function doLogin(user, pw) {
username = user;
password = pw;
// 执行剩下的登录工作
}
var publicAPI = {
login: doLogin
};
return publicAPI;
}
// 创建一个User模块实例
var fred = User();
fred.login("fred", "123456");
复制代码
函数User()
用作外层作用域,持有变量username
和password
,以及内层的函数doLogin();这些都是这个User模块私有的内部细节,无法从外部访问。
4.this标识符
this
并不指向这个函数本身。
function foo() {
console.log(this.bar);
}
var bar = 'global';
var obj1 = {
bar: 'obj1',
foo: foo
};
var obj2 = {
bar: 'obj2'
};
// -----
foo(); // "global"
obj1.foo(); // "obj1"
foo.call(obj2); // "obj2"
new foo(); // undefined
复制代码
5.原型
当引用对象的某个属性时,如果这个属性并不存在,那么JavaScript会自动使用对象的内部原型引用找到另外一个对象来寻找这个属性。可以将这点看作是属性缺失情况的备用模式。
从一个对象到其后备对象的内部原型引用的链接是在创建对象时发生的。展示着一点的最简单方法就是使用内置工具Object.create(..)
。
var foo = {
a: 42
};
//创建bar并将其链接到foo
var bar = Object.create(foo);
bar.b = "hello world";
bar.b; // "hello world"
bar.a; // 42 <--委托给foo
foo.b; // undefined
复制代码