浅析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 css样式操作代码(批量操作)
Oct 09 Javascript
利用JS自动打开页面上链接的实现代码
Sep 25 Javascript
javascript学习笔记(七) js函数介绍
Jun 19 Javascript
jquery中animate动画积累的解决方法
Oct 05 Javascript
JS小功能(onmouseover实现选择月份)实例代码
Nov 28 Javascript
js实现的折叠导航示例
Nov 29 Javascript
javascript创建动态表单的方法
Jul 25 Javascript
Javascript实现的Map集合工具类完整实例
Jul 31 Javascript
ashx文件获取$.ajax()方法发送的数据
May 26 Javascript
Ionic + Angular.js实现图片轮播的方法示例
May 21 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
Aug 22 Javascript
node.js爬取中关村的在线电瓶车信息
Nov 13 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
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
PHP实现浏览器格式化显示XML的方法示例
2019/01/22 PHP
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
jquery滚动条插件slimScroll使用方法
2017/02/09 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
Vue项目pdf(base64)转图片遇到的问题及解决方法
2018/10/19 Javascript
支付宝小程序tabbar底部导航
2018/11/06 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
javascript+HTML5 canvas绘制时钟功能示例
2019/05/15 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
JavaScript ES 模块的使用
2020/11/12 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
Django获取应用下的所有models的例子
2019/08/30 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
Python可以用来做什么
2020/11/23 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
html5图片上传预览示例分享
2014/04/14 HTML / CSS
电子狗项圈:eDog Australia
2019/12/04 全球购物
领导视察欢迎词
2014/01/15 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
端午节寄语2015
2015/03/23 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
Hive HQL支持2种查询语句风格
2022/06/25 数据库