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),这时一定要小心,不要随便改变父函数内部变量的值。