var outerValue = 'ninja'; var later; function outerFunction() { // 该变量的作用域限制在该函数内部,并且在函数外部访问不到; var innerValue = 'samurai'; // 在外部函数内,声明一个内部函数。 // 注意:声明该函数时,innerValue是在作用域内的 function innerFunction() { assert(outerValue, 'I can see the ninja'); assert(innerValue, 'I can see the samurai'); // 将内部函数引用到later变量上,由于later在全局作用域内,所以可以对它进行调用。 later = innerFunction; } } // 调用外部函数,将会声明内部函数,并将内部函数赋值给later变量。 outerFunction(); // 通过later调用内部函数。 // 我们不能直接调用内部函数,因为它的作用域(和innerValue一起)被限制在outerFunction内。 later();
闭包使用场景:私有变量
在构造器内隐藏变量,使其在外部作用域不可访问,但是可以存在于闭包内。
function Ninja() { var feints = 0; this.getFenits = function() { return feints; } this.feint = function() { feints++; } } var ninja = new Ninja(); ninja.feint(); assert(ninja.getFenits() === 1, '调用一次,内部变量++'); assert(ninja.feints === undefined, '函数外部不可访问')
变量的作用域依赖于变量所在的闭包
闭包记住的是变量的引用,而不是闭包创建时刻该变量的值
原型与面向对象
所有的函数在初始化时都有一个prototype属性,该属性的初始值是一个空对象。
使用new操作符将函数作为构造器进行调用的时候,其上下文被定义为新对象的实例。
在构造器内的绑定操作优先级永远高于在原型上的绑定操作优先级。因为构造器的this上下文指向的是实例自身,所以我们可以在构造器内对核心内容执行初始化操作。
通过instanceof操作,可以判断函数是否继承了其原型链中任何对象的功能。
您可能感兴趣的文章: