浅析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 相关文章推荐
javascript网页关键字高亮代码
Jul 30 Javascript
js过滤数组重复元素的方法
Sep 05 Javascript
js冒泡法和数组转换成字符串示例代码
Aug 14 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
Jul 06 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
Nov 29 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
Apr 16 Javascript
解决vue router使用 history 模式刷新后404问题
Jul 19 Javascript
webpack4打包vue前端多页面项目
Sep 17 Javascript
原生JS实现随机点名项目的实例代码
Apr 30 Javascript
vue的列表交错过渡实现代码示例
May 05 Javascript
浅谈vuex中store的命名空间
Nov 08 Javascript
vue-resource 拦截器interceptors使用详解
Jan 18 Vue.js
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
WordPress中用于更新伪静态规则的PHP代码实例讲解
2015/12/18 PHP
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
Vue Ajax跨域请求实例详解
2017/06/20 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
Python3.6简单操作Mysql数据库
2017/09/12 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
2017/12/25 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
Python_查看sqlite3表结构,查询语句的示例代码
2019/07/17 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
掌上明珠Java程序员面试总结
2016/02/23 面试题
关爱女孩行动实施方案
2014/03/13 职场文书
《回乡偶书》教学反思
2014/04/12 职场文书
高中生操行评语大全
2014/04/25 职场文书
授权委托书格式
2014/07/31 职场文书
女生抽烟检讨书
2014/10/05 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
WebWorker 封装 JavaScript 沙箱详情
2021/11/02 Javascript
索尼ICF-5900W收音机测评
2022/04/24 无线电
小程序实现侧滑删除功能
2022/06/25 Javascript