首页 > 语言 > JavaScript > 正文

js闭包实例汇总

2024-05-06 14:50:18
字体:
来源:转载
供稿:网友

Js闭包
闭包前要了解的知识
1. 函数作用域
(1).Js语言特殊之处在于函数内部可以直接读取全局变量

代码如下:
<script type="text/javascript">
var n=100;
function parent(){
  alert(n);
}
parent();//100
</script>

如果在php里

代码如下:
<?php
$n=100;
function parent(){
  echo $n;
}
parent();//会报错 n未定义
?>

(2).在函数外部无法读取函数内的局部变量

代码如下:
<script type="text/javascript">
function parent(){
  var m=50;
}
parent();
alert(m);//报错 m未定义
</script>

注意函数内部声明变量时一定要加var,否则就声明了一个全局变量

代码如下:
function parent(){
m=50;
}
parent();
alert(m);//50

//当然在php里更是如此了,

代码如下:
<?php
function parent(){
  global $m;//全局 ,定义与赋值要分开
  $m=50;
}
parent();
echo $m;//50
?>
//没global的话,一样会报没定义的错误

有时,需要得到函数内部的的局部变量,就需要变通的方法实现利用js变量作用域的特点,如在函数内部定义子函数,对于子函数来说,父函数就是它的全局,子函数可以访问父函数里的变量(对于整个js代码来说又是局部变量)

代码如下:
<script type="text/javascript">
function parent(){
   var m=50;
   function son(){
        alert(m);
   }
   return son;
}
var s=parent();//将结果保存在全局里
s();//50
</script>

Parent内部所有局部变量对其子函数来说都是可见的,但其子函数内的局部变量对其父函数是不可见的,这就是js特有的链式作用域结构,子对象会一级一级地向上查找所有父对象的变量,父对象的所有变量对子对象都是可见的,反之不成立!上面的son函数就是闭包
有些同学可能这样

代码如下:
function parent(){
   var m=50;
   function son(){
        alert(m);
   }
}
parent();
son()//会报 函数son未定义

注意 在javascript里,在函数里声明的函数都是局部的,函数运行完后就释放了
注意这点与php的区别

代码如下:
<?php
function parent(){
  function son(){
      $m=50;
      echo $m;
  }
}
parent();
son();//输出50 不会报错
?>

闭包

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选