深入理解JavaScript系列(2):揭秘命名函数表达式(8)

来源:未知 责任编辑:责任编辑 发表时间:2014-01-26 22:00 点击:

不过神奇的还是,函数中的变量甚至会与已有的Object.prototype的成员发生冲突,来看看下面的代码:

  (function(){        var constructor = function(){ return 1; };        (function(){            constructor(); // 求值结果是{}(即相当于调用了Object.prototype.constructor())而不是1            constructor === Object.prototype.constructor; // true      toString === Object.prototype.toString; // true            // ……          })();  })();复制代码
要避免这个问题,要避免使用Object.prototype里的属性名称,如toString, valueOf, hasOwnProperty等等。

 

JScript解决方案

  var fn = (function(){    // 声明要引用函数的变量    var f;    // 有条件地创建命名函数    // 并将其引用赋值给f    if (true) {      f = function F(){ }    }    else if (false) {      f = function F(){ }    }    else {      f = function F(){ }    }    // 声明一个与函数名(标识符)对应的变量,并赋值为null    // 这实际上是给相应标识符引用的函数对象作了一个标记,    // 以便垃圾回收器知道可以回收它了    var F = null;    // 返回根据条件定义的函数    return f;  })();复制代码
最后我们给出一个应用上述技术的应用实例,这是一个跨浏览器的addEvent函数代码:

  // 1) 使用独立的作用域包含声明  var addEvent = (function(){    var docEl = document.documentElement;    // 2) 声明要引用函数的变量    var fn;    if (docEl.addEventListener) {      // 3) 有意给函数一个描述性的标识符      fn = function addEvent(element, eventName, callback) {        element.addEventListener(eventName, callback, false);      }    }    else if (docEl.attachEvent) {      fn = function addEvent(element, eventName, callback) {        element.attachEvent('on' + eventName, callback);      }    }    else {      fn = function addEvent(element, eventName, callback) {        element['on' + eventName] = callback;      }    }    // 4) 清除由JScript创建的addEvent函数    //    一定要保证在赋值前使用var关键字    //    除非函数顶部已经声明了addEvent    var addEvent = null;    // 5) 最后返回由fn引用的函数    return fn;  })();复制代码

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Gb2312转utf-8编码的方法(vbs+js)
  • 如何使用Ajax技术开发Web应用程序(1)
  • js跳转路径问题
  • JavaScript模仿桌面窗口
  • 用js检测两个线段是否相交
  • 我知道的JavaScript -- 设计模式(桥接)应用之 – 验证器
  • 运用JavaScript构建你的第一个Metro式应用程序(on Windows
  • 我是如何去了解jquery的(六),案例之幻灯片轮换
  • Jquery封装幻灯片效果
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1