浅析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 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
Apr 07 Javascript
用AJAX返回HTML片段中的JavaScript脚本
Jan 04 Javascript
jquery datepicker参数介绍和示例
Apr 15 Javascript
JavaScript将数组转换成CSV格式的方法
Mar 19 Javascript
js实现的牛顿摆效果
Mar 31 Javascript
jQuery实现仿Google首页拖动效果的方法
May 04 Javascript
vue.js  父向子组件传参的实例代码
Oct 29 Javascript
vue的一个分页组件的示例代码
Dec 25 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
Mar 01 Javascript
vue表单数据交互提交演示教程
Nov 13 Javascript
环形加载进度条封装(Vue插件版和原生js版)
Dec 04 Javascript
详解node和ES6的模块导出与导入
Feb 19 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/01/24 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
Yii2增加验证码步骤详解
2016/04/25 PHP
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
js实现悬浮窗效果(支持拖动)
2017/03/09 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
Angular6笔记之封装http的示例代码
2018/07/27 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
JS跨浏览器解析XML应用过程详解
2020/10/16 Javascript
Python实现远程调用MetaSploit的方法
2014/08/22 Python
以windows service方式运行Python程序的方法
2015/06/03 Python
python函数形参用法实例分析
2015/08/04 Python
一个Python最简单的接口自动化框架
2018/01/02 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
python连接mongodb密码认证实例
2018/10/16 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
python deque模块简单使用代码实例
2020/03/12 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
英语专业职业生涯规划范文
2014/03/05 职场文书
产品质量承诺书范文
2014/03/27 职场文书
环保建议书200字
2014/05/14 职场文书
小学生植树节活动总结
2014/07/04 职场文书
电大奖学金获奖感言
2014/08/14 职场文书
2015年度党员个人总结
2015/02/14 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
团结主题班会
2015/08/13 职场文书
2016年寒假生活小结
2015/10/10 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
Java 异步任务计算FutureTask
2022/04/28 Java/Android