Javascript,闭包

时间:2022-07-03 10:26:40

js变量的调用

一、全局变量函数调用

var n = 99;
function f1() {
alert(n);
}
f1();//99

在函数外部定义的变量,再函数中可以被调用,因为变量n,与f1在同一个域下。

二、内部变量函数错误调用

function f1() {
var n = 99;
}
alert(n);//错误

变量n在函数f1中,所以在外部得不到n的值;n与f1不是平级的。

三、不带var的变量默认为全局变量

function f1() {
n = 99;
}
f1();
alert(n);//9

js中默认不带var修饰符的自动成为全局变量,在当前window的任何地方都可以调取到。

四、外部读取局部变量

function f1() {
var n = 99;
function f2() {
alert(n);
}
return f2;
}
var result = f1();
result();//99

内部变量想要在外部使用,这时就用到了闭包。

五、闭包公式例子

function f1() {
var n = 999;
nAdd = function () { n += 1 };

function f2() {
alert(n);
}

return f2;
};

var result = f1();

result();//999

nAdd();

result();//1000

闭包的用途(1、读取函数内部的变量;2、让变量的值始终保持在内存中)

六、变量作用于this应用

var name = 'the window';
var obj = {
name: 'my obj',
getNameFunc: function () {
return function () {
return this.name;
};
}
};

alert(obj.getNameFunc()());//the window

通过闭包,函数内部的函数为全局服务。

var name = 'the window';
var obj = {
name: 'my obj',
getNameFunc: function () {
var that = this;
return function () {
return that.name;
};
}
};

alert(obj.getNameFunc()());//my obj

另一简单应用:

<a onclick="touchThis(this)" href="javascript:touchThis(this)" ></a>

七、var和this不是一回事

var w = 100;
function f1() {
//var w=101;
//this.w=102;
function f2() {
document.write(this.w);
}
return f2;
}
f1()();
//输出:100

var w = 100;
function f1() {
var w = 101;
//this.w=102;
function f2() {
document.write(this.w);
}
return f2;
}
f1()();
//输出:100

var w = 100;
function f1() {
w = 101;
//this.w=102;
function f2() {
document.write(this.w);
}
return f2;
}
f1()();
//输出:101

var w = 100;
function f1() {
//var w=101;
this.w = 102;
function f2() {
document.write(this.w);
}
return f2;
}
f1()();
//输出:102

1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。