js面向对象-闭包

时间:2021-01-13 22:45:14

理解变量的作用域、垃圾回收。

javascript语言特殊之处:在函数内声明变量一定用var,不用的话实际上是声明了一个全局变量。

js若类型语言,灵活,但安全性低。

如:

        function Person()
{
this.name = "xiaoqiu";
this.GetName = function () {
return this.name;
}
}
Person();
alert(window.GetName());
这里window都可以调用到GetName方法.为什么?

javascript中,function既可以作为方法,也可以作为类。这里Person()意味着调用了这个方法。

那么,方法中有this关键字,this指向本身,这里直接被调用了,this没有指向一个对象。

所以就默认指向了被调用者->window.

那么window就拥有了Person内部的GetName方法。这样是不安全的。

闭包是 JavaScript 一个非常重要的特性,这意味着当前作用域总是能够访问外部作用域中的变量。 因为函数是 JavaScript 中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数。

闭包的场景:
1.使用闭包可以在JavaScript中模拟块级作用域;
2.闭包可以用于在对象中创建私有变量。

闭包主要特征:

1、有两个或两个以上的函数有相互嵌套相互指向。

2、必有函数或结果被retrun
改进:
  function Person()
{
this.name = "xiaoqiu";
return {
'GetName': function () {
return name;
}
}
}
Person();
alert(window.GetName());
这里window再调用GetName方法就会报错了.window.GetName is not a function
        function Person() {
this.name = "xiaoqiu";
//return {
// 'GetName': function () {
// return name;
// },
// 'GetAge': function () {
// return 21;
// }
//}
function GetName() {
return name;
}
function GetAge() {
return 21;
}
//内部嵌套函数,可以返回json组合,这样就有了私有变量
return {
n: GetName(),
a: GetAge()
}
}
var p = Person();
alert(p.n + "..." + p.a);
记住return的存在与函数的指向,如若使用过多的闭包会造成内存不足,慎重使用。