浅析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读取cookie方法总结
Oct 31 Javascript
常见的jQuery选择器汇总
Nov 24 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
Jan 26 Javascript
Jquery解析json字符串及json数组的方法
May 29 Javascript
Angularjs实现搜索关键字高亮显示效果
Jan 17 Javascript
jQuery Ajax实现跨域请求
Jan 21 Javascript
关于在mongoose中填充外键的方法详解
Aug 14 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
Feb 08 Javascript
VUE重点问题总结
Mar 19 Javascript
JavaScript设计模式之责任链模式实例分析
Jan 16 Javascript
函数式编程入门实践(一)
Apr 20 Javascript
微信小程序实现左滑动删除效果
Mar 30 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
header()函数使用说明
2006/11/23 PHP
PHP的中问验证码
2006/11/25 PHP
探讨php中遍历二维数组的几种方法详解
2013/06/08 PHP
Yii rules常用规则示例
2016/03/15 PHP
深入理解php printf() 输出格式化的字符串
2016/05/23 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
python定时检查启动某个exe程序适合检测exe是否挂了
2013/01/21 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
python 重定向获取真实url的方法
2018/05/11 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
浅谈Python 函数式编程
2020/06/20 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
Python __slots__的使用方法
2020/11/15 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
公司财务流程之主管工作流程
2014/03/03 职场文书
2014年医院十一国庆节活动方案
2014/09/15 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
2014年文秘工作总结
2014/11/25 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
2019年警察入党转正申请书最新范文
2019/09/03 职场文书
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript