浅析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 parentElement和offsetParent之间的区别
Mar 23 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
May 23 Javascript
jQuery div层的放大与缩小简单实现代码
Mar 28 Javascript
JavaScript获取网页表单action属性的方法
Apr 02 Javascript
简单谈谈Javascript中类型的判断
Oct 19 Javascript
js调用webservice构造SOAP进行身份验证
Apr 27 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
Apr 13 jQuery
JQuery实现table中tr上移下移的示例(超简单)
Jan 08 jQuery
js获取form表单中name属性的值
Feb 27 Javascript
node.js ws模块搭建websocket服务端的方法示例
Apr 25 Javascript
js实现页面图片消除效果
Mar 24 Javascript
js+canvas实现刮刮奖功能
Sep 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内核探索之解释器的执行过程
2015/12/22 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
php+laravel依赖注入知识点总结
2019/11/04 PHP
Bookmarklet实现启动jQuery(模仿 云输入法)
2010/09/15 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
2018/01/05 NodeJs
webpack构建的详细流程探底
2018/01/08 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
Python读取Excel的方法实例分析
2015/07/11 Python
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
利用Python将数值型特征进行离散化操作的方法
2018/11/06 Python
python使用thrift教程的方法示例
2019/03/21 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
Python无头爬虫下载文件的实现
2020/04/02 Python
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
通用自荐信范文
2014/03/14 职场文书
家长写给孩子的评语
2014/04/18 职场文书
2014年涉外离婚协议书范本
2014/11/20 职场文书
秋收起义观后感
2015/06/11 职场文书
思想工作总结范文
2015/08/12 职场文书