理解变量的作用域、垃圾回收。
javascript语言特殊之处:在函数内声明变量一定用var,不用的话实际上是声明了一个全局变量。
js若类型语言,灵活,但安全性低。
如:
function Person()这里window都可以调用到GetName方法.为什么?
{
this.name = "xiaoqiu";
this.GetName = function () {
return this.name;
}
}
Person();
alert(window.GetName());
javascript中,function既可以作为方法,也可以作为类。这里Person()意味着调用了这个方法。
那么,方法中有this关键字,this指向本身,这里直接被调用了,this没有指向一个对象。
所以就默认指向了被调用者->window.
那么window就拥有了Person内部的GetName方法。这样是不安全的。
闭包是 JavaScript 一个非常重要的特性,这意味着当前作用域总是能够访问外部作用域中的变量。 因为函数是 JavaScript 中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数。
闭包的场景:
1.使用闭包可以在JavaScript中模拟块级作用域;
2.闭包可以用于在对象中创建私有变量。
闭包主要特征:
1、有两个或两个以上的函数有相互嵌套相互指向。
2、必有函数或结果被retrun改进:
function Person()这里window再调用GetName方法就会报错了.window.GetName is not a function
{
this.name = "xiaoqiu";
return {
'GetName': function () {
return name;
}
}
}
Person();
alert(window.GetName());
function Person() {记住return的存在与函数的指向,如若使用过多的闭包会造成内存不足,慎重使用。
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);