更新时间:2022-09-05 17:14:40
function my(){
}
my(); //别忘记调用
(function(){ //这里第一个左括号是必须的,如果不写,JavaScript解析器会将
//function解析成函数声明语句,使用的话解析成函数定义表达式
}()) //这里的()的作用是,函数定义完毕后立即调用它。
function a(){
var a1=2;
}
function b(){
var b1=3;
}
function b(){
var b1=3;
function a(){
var a1=2;
alert(b1);
}
a();
}
b(); //结果=>3
这样就实现了?然并卵啊!闭包的现实意义在哪?当然“真正”有意义的闭包并不是这样。
闭包的作用:外部函数可以读取函数内部的变量。
另一个就是让这些变量的值始终保持在内存中。
function b(){
var b1=3;
return function (z){
var a1=2;
return alert(b1+z);
}
}
var a=b();
a(2); //=>5
这样我们就在全局作用域中调用了b1这个内部变量。(个人理解,如果有误还请指教。)
匿名函数被返回后,它的作用域链被初始化为包含b()函数的活动对象和全局变量对象。这样匿名函数就可以访问b()中的所有变量。
function ca(){
var arry=[];
for(var i=0;i<10;i++){
arry[i]=function(){
return i;
}
}
return arry;
}
function ca(){
var arry=[];
for(var i=0;i<10;i++){
arry[i]=function(num){
return function(){
return num;
}
}
}
return console.log(arry);
}
ca();
上面强制闭包错误!返回的都是function(num){}。
下面提供正确的方式:
//第一种方式
function ca(){
var arry=[];
for(var i=0;i<10;i++){
arry[i]=(function(i){
return i;
})(i);
}
return console.log(arry[5]);;
}
ca();
//->5
//第二种方式
function ca(){
var arry=[];
for(var i=0;i<10;i++){
arry[i]=function(){
var n=i;
return n;
}();
}
return console.log(arry[8]);
}
ca();
//->5
我们没有直接把闭包函数赋值给数组,而是定义了一个匿名函数,并将立即执行该匿名函数的结果赋值给数组。
这两种方式都能得到自己想要的结果。
这里在举个实际中的例子:
<!doctype html>
<title></title>
<meta charset="utf-8"/>
<script type="text/javascript">
window.onload = function(){
//方法一
var lists = document.getElementsByTagName("li");
for(var i=0,l=lists.length; i < l; i++){
lists[i].onclick=(function(i){// 强制闭包
return function(){
alert(i)
}
})(i)
}
//方法二
var lists = document.getElementsByTagName("li");
for(var i=0,l=lists.length; i < l; i++){
lists[i].onclick=function(){
var n=i;
return function(){
alert(n)
}
}()
}
}
</script>
<ul>
<li id="a1">aa</li>
<li id="a2">aa</li>
<li id="a3">aa</li>
</ul>
var f=new Fuction("x","y","return x*y;");
//->等价于
var f=function(x,y){
return x*y
}
5.constructor属性
var F=function(){} //这是一个函数对象
var p=F.prototype; //这是F相关联的原型对象
var c=p.constructor; //true
c===F //对于任意函数F.prototype.constructor==F
var o=new F(); //创建类F的一个对象
o.constructor===F //true,constructor属性指代这个类
6.多catch从句
try{
//这里肯呢个会抛出多种类型异常
throw 1;
}
catch(e if e instanceof ReferenceError){
//这里处理引用错误
}
catch(e if e==="quit"){
//这里处理抛出的字符串是"quit"的情况
}
catch(e if typeof e==="string"){
//处理其他字符串的情况
}
catch(e){
//处理剩下的异常
}
finally{
//finally从句正常执行
}
转载:http://www.cnblogs.com/zqzjs/p/4824281.html