浅析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分页
Jun 07 Javascript
jquery实现的网页自动播放声音
Apr 30 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
Dec 02 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
Jan 28 Javascript
jquery datatable服务端分页
Aug 31 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
Jan 04 Javascript
Angular的$http的ajax的请求操作(推荐)
Jan 10 Javascript
vue双向数据绑定知识点总结
Apr 18 Javascript
小程序server请求微信服务器超时的解决方法
May 21 Javascript
js利用iframe实现选项卡效果
Aug 09 Javascript
vue 动态添加class,三个以上的条件做判断方式
Nov 02 Javascript
js重写alert事件(避免alert弹框标题出现网址)
Dec 04 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有道翻译api调用方法实例
2014/12/22 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
JavaScript高级程序设计
2006/12/29 Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
2013/07/01 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
阿里云ecs服务器中安装部署node.js的步骤
2016/10/08 Javascript
vue.js实现价格格式化的方法
2017/05/23 Javascript
jQuery.Ajax()的data参数类型详解
2017/07/23 jQuery
ReactNative Image组件使用详解
2017/08/07 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
vue实现简单loading进度条
2018/06/06 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
初步解析Python下的多进程编程
2015/04/28 Python
python实现合并多个list及合并多个django QuerySet的方法示例
2019/06/11 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
2019/11/19 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
HTML5拖放API实现拖放排序的实例代码
2017/05/11 HTML / CSS
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
RealTek面试题
2016/06/28 面试题
普师专业个人自荐信范文
2013/11/26 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
三好生演讲稿
2014/09/12 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
业务内勤岗位职责
2015/04/13 职场文书
养成教育主题班会
2015/08/13 职场文书
Golang 如何实现函数的任意类型传参
2021/04/29 Golang
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript