浅析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 相关文章推荐
jQuery ajax(复习)—Baidu ajax request分离版
Jan 24 Javascript
javascript时间函数基础介绍
Mar 28 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
May 26 Javascript
JavaScript模拟实现继承的方法
Mar 30 Javascript
20分钟轻松创建自己的Bootstrap站点
May 12 Javascript
jQuery条件分页 代替离线查询(附代码)
Aug 17 jQuery
React Native之TextInput组件解析示例
Aug 22 Javascript
微信小程序实现滴滴导航tab切换效果
Jul 24 Javascript
微信小程序中遇到的iOS兼容性问题小结
Nov 14 Javascript
Vue数据双向绑定的深入探究
Nov 27 Javascript
js中Generator函数的深入讲解
Apr 07 Javascript
uniapp引入支付宝原生扫码插件步骤详解
Jul 23 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
PHP 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
php 读取文件乱码问题
2010/02/20 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
2013/06/13 PHP
解析csv数据导入mysql的方法
2013/07/01 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
写给想学习Javascript的朋友一点学习经验小结
2010/11/23 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
js自动下载文件到本地的实现代码
2013/04/28 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
JavaScript中的Primitive对象封装介绍
2014/12/31 Javascript
JS运动框架之分享侧边栏动画实例
2015/03/03 Javascript
使用javascript插入样式
2016/03/14 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
jQuery+HTML5实现弹出创意搜索框层
2016/12/29 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
2017/03/15 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
layui表格设计以及数据初始化详解
2019/10/26 Javascript
基于vue.js实现购物车
2020/01/15 Javascript
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
Python pymongo模块常用操作分析
2018/09/01 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
python 实现检验33品种数据是否是正态分布
2019/12/09 Python
优质的学校老师推荐信
2013/10/28 职场文书
运动会广播稿150字
2014/02/19 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
授权委托书(公民个人适用)
2014/09/19 职场文书
2015年小学校长工作总结
2015/05/19 职场文书
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript