浅析js封装和作用域


Posted in Javascript onJuly 09, 2013

基本的代码如下

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>  
</title>
<script src="jquery-1.4.4.min.js" type="text/javascript"></script> 
<script type="text/javascript">    
      var text="test"; 
   var   t=new functionTest(text); 
    function functionTest(text)
    {
          var alertText=text   
             $("#btnSave").click(function (e) {     
       alertTestInnert();   
    });             
          this.AlertTest= function ()
     {      
        alert(alertText);
     } 
      function alertTestInnert()
     {
        alert(alertText);
     } 
    } 
      function alertTestOuter()
   {
        alert(text);
   }
    </script>
<body>
 <input type="button" id="btnSave" class="button" value="保存"  />
 <input type="button" id="btnCancel" class="button" value="取消" onclick="javascript:t.AlertTest;" />
</body>
</html>

再点击保存,取消时需要一定的操作,第一次的代码如上:
点击保存,根本没反应,很奇怪,这种最常用的jquery绑定事件竟然不起作用了。后来一比较才知道,其实自己忘了,绑定应该在$(document).ready(function () {})中进行;
js修改如下:
 var text="test"; 
   $(document).ready(function () {
      var   t=new functionTest(text); 
 });   
    function functionTest(text)
    {
          var alertText=text   
             $("#btnSave").click(function (e) {     
       alertTestInnert();   
    });             
          this.AlertTest= function ()
     {      
        alert(alertText);
     } 
      function alertTestInnert()
     {
        alert(alertText);
     } 
    } 
      function alertTestOuter()
   {
        alert(text);
   }

修改后,点击保存可以了,而且正确的传递了参数,这样就可以保证在不同点的情况下传递不同的参数了。
但还有一种情况,页面会动态生成一些标签,这些标签的点击事件也需要处理。再次以取消按钮为例,由于是动态生成,就不能使用和保存一样的方法了。
只能使用onclick="javascript:t.AlertTest;"这种类似的绑定。于是有测试如下:
修改
 <input type="button" id="btnCancel" class="button" value="取消" onclick="javascript:t.AlertTest;" />

点击没反应,修改如下
 <input type="button" id="btnCancel" class="button" value="取消" onclick="javascript:alertTestOuter;" />

点击还是没反应,也没有错误,在修改如下:
 <input type="button" id="btnCancel" class="button" value="取消" onclick="javascript:alertTestOuter();" />

这次有反应了,看来是少了一对括号。修改为封装的方法如下:
<input type="button" id="btnCancel" class="button" value="取消" onclick="javascript:t.AlertTest();" />

点击没反应,提示Uncaught ReferenceError: t is not defined
看来是变量t没有定义,作用域起作用了。于是修改js如下,也就是把变量t放到外边,赋值放在里边,就是如下:
  var   t;
      var text="test"; 
   $(document).ready(function () {
          t=new functionTest(text); 
 });   
    function functionTest(text)
    {
          var alertText=text   
             $("#btnSave").click(function (e) {     
       alertTestInnert();   
    });             
          this.AlertTest= function ()
     {      
        alert(alertText);
     } 
      function alertTestInnert()
     {
        alert(alertText);
     } 
    } 
      function alertTestOuter()
   {
        alert(text);
   }

最后一步,如何给取消调用的方法传递参数?
第一步修改js如下,也就是把取消调用的函数改为需要传递参数的方法,代码如下:
  var   t;
      var text="test"; 
   $(document).ready(function () {
          t=new functionTest(text); 
 });   
    function functionTest(text)
    {
          var alertText=text   
             $("#btnSave").click(function (e) {     
       alertTestInnert();   
    });             
          this.AlertTest= function (text)
     {      
        alert(text);
     }      function alertTestInnert()
     {
        alert(alertText);
     } 
    } 
      function alertTestOuter()
   {
        alert(text);
   }

相应的html修改如下:
 <input type="button" id="btnCancel" class="button" value="取消" onclick="javascript:t.AlertTest('124');" />

点击,看看是不是正确的传递了参数,一切正常,看来这样就完成了。
最后整理js代码:
把通用的js代码放到一个js文件里,这里放到了common.js中,不同的代码放在htm中,修改后的所有代码如下:
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>  
</title>
<script src="jquery-1.4.4.min.js" type="text/javascript"></script> 
<script src="common.js" type="text/javascript"></script> 
<script type="text/javascript">  
      var   t;//需要定义的外边,否则点击取消时,不能访问到变量t
      var text="test"; //传递的参数
   $(document).ready(function () {      
          t=new functionTest(text); //给t赋值,定义不能放在这里边
 });
    </script>
<body>
 <input type="button" id="btnSave" class="button" value="保存"  />
 <input type="button" id="btnCancel" class="button" value="取消" onclick="javascript:t.AlertTest('124');" />
</body>
</html>

common.js的代码:
 function functionTest(text)
    {
          var alertText=text   
             $("#btnSave").click(function (e) {     
       alertTestInnert();   
    });             
          this.AlertTest= function (text)
     {      
        alert(text);
     }      function alertTestInnert()
     {
        alert(alertText);
     } 
    }   
Javascript 相关文章推荐
代码精简的可以实现元素圆角的js函数
Jul 21 Javascript
Javascript 获取链接(url)参数的方法
Feb 15 Javascript
javascript下4个跨浏览器必备的函数
Mar 07 Javascript
很好用的js日历算法详细代码
Mar 07 Javascript
PHP开发者必须掌握的6个关键字
Apr 14 Javascript
JavaScript分秒倒计时器实现方法
Feb 02 Javascript
简介AngularJS的视图功能应用
Jun 17 Javascript
js遍历map javaScript遍历map的简单实现
Aug 26 Javascript
AngularJS指令与指令之间的交互功能示例
Dec 14 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
Jan 01 Javascript
基于angular实现三级联动的生日插件
May 12 Javascript
Angularjs验证用户输入的字符串是否为日期时间
Jun 01 Javascript
js正则表达式的使用详解
Jul 09 #Javascript
解析Jquery的LigerUI如何实现文件上传
Jul 09 #Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
Jul 09 #Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
Jul 09 #Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
Jul 09 #Javascript
浅析js中取绝对值的2种方法
Jul 09 #Javascript
浅析LigerUi开发中谨慎载入common.css文件
Jul 09 #Javascript
You might like
Syphon 使用方法
2021/03/03 冲泡冲煮
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
PHP命名空间namespace用法实例分析
2016/09/27 PHP
php redis实现文章发布系统(用户投票系统)
2017/03/04 PHP
php如何获取Http请求
2020/04/30 PHP
Extjs4 Treegrid 使用心得分享(经验篇)
2013/07/01 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
2016/06/21 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
浅析vue 函数配置项watch及函数 $watch 源码分享
2018/11/22 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
Python下rrdtool模块的基本使用方法
2015/11/13 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
python 3.5下xadmin的使用及修复源码bug
2017/05/10 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
Python subprocess库的使用详解
2018/10/26 Python
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
Hibernate持久层技术
2013/12/16 面试题
给校长的建议书200字
2014/05/16 职场文书
校庆标语集锦
2014/06/25 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
失职检讨书大全
2015/01/26 职场文书
个人简历求职信范文
2015/03/20 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
法律意见书范本
2015/06/04 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
JS 基本概念详细介绍
2021/10/16 Javascript
总结高并发下Nginx性能如何优化
2021/11/01 Servers