详解JavaScript作为命名空间的函数

news/2024/10/4 0:06:43 标签: javascript, 前端, java

8.5 作为命名空间的函数

函数作用域,在函数中声明的变量在整个函数体内都是可见的,函数外部是不可见的。

不在任何函数内声明的变量是全局变量,整个JS程序中都是可见的。

JS中无法声明只在一个代码块内可见的变量,基于这个原因,我们常常简单的定义一个函数用作临时的命名空间,在这个命名空间内定义的变量都不会污染到全局命名空间。

比如:假设你写一段JS模块代码,这段代码是共用的,定义了一个存储中间计算结果的变量,问题来了,放到不同程序执行时,无法得知这个变量是否已经创建,若存在这个变量,将会和代码冲突,解决方法当然是将代码放入一个函数内,然后调用这个函数。这样全局变量就变成了函数内的局部变量。

javascript>javascript">function mymodule(){
    //这个模块所使用的所有变量都是局部变量
    //而不是污染全局命名空间
}
mymodule();

这样还是太麻烦,可以直接定义一个匿名函数,并在单个表达式中调用它:

javascript>javascript">(function(){
    //模块代码
}());//结束函数并立即调用它

这种定义匿名函数并立即在单个表达式中调用它的写法非常常见,已经成为一种惯用法了。

8.5.1特定场景下返回带补丁的extend()版本

javascript>javascript">
//定义一个拓展函数,用来将第二个以及后续参数复制到第一个参数
//这里我们处理了IE bug:在多数IE版本中,如果o的属性拥有一个不可枚举的同名属性,则
//for/in循环不会枚举对象o的可枚举属性,也就是说将不会正确的处理诸如toString的属性。
//除非我们显式检测它
//将函数的返回值赋值给extend
var extend = (function() {
    //修复之前检查是否存在bug
    for (var p in {
            toString: null
        }) {
        //一个简单版本的extend()函数
        return function extend(o) {
            for (var i = 1; i < arguments.length; i++) {
                var source = arguments[i];
                for (var prop in source) {
                    o[prop] = source[prop];
                }
            }
            return o;
        };
    }
    //返回另一个版本的extend()函数
    return function patched_extend(o) {
        for (var i = 1; i < arguments.length; i++) {
            var source = arguments[i]; //复制所有的可枚举属性
            for (var prop in source) {
                o[prop] = source[prop]; //现在检查特殊属性
                for (var j = 0; j < protoprops.length; j++) {
                    prop = protoprops[j];
                    if (source.hasOwnProperty(prop)) {
                        o[prop] = source[prop];
                    }
                }

            }
        }
        return o;
    };
    //需要检查特殊的属性列表
    var protoprops = ["toString", "valueOf", "constructor", "hasOwnProperty", "isPrototypeOf",
        "propertyIsEnumerable", "toLocaleString"
    ];
}());


http://www.niftyadmin.cn/n/5689156.html

相关文章

Vue3轻松实现前端打印功能

文章目录 1.前言2.安装配置2.1 下载安装2.2 main.js 全局配置3.综合案例3.1 设置打印区域3.2 绑定打印事件3.3 完整代码4.避坑4.1 打印表格无边框4.2 单选框复选框打印不选中4.3 去除页脚页眉4.4 打印內容不自动换行1.前言 vue3 前端打印功能主要通过插件来实现。 市面上常用的…

硬件面试(一)

网上别人的硬件面试记录&#xff0c;察漏补缺&#xff1a; 1.骄傲容易被打脸&#xff01; 励磁电感和谐振电感的比值K大小有什么含义: 励磁电感和谐振电感的比值 KKK 通常用来衡量电路的特性。当 KKK 较大时&#xff0c;表示励磁电感相对于谐振电感较强&#xff0c;可能导致…

过滤器 Filter vs 拦截器 Interceptor

之前已经详细介绍过了过滤器Filter 和 拦截器Interceptor 了&#xff0c;本文将两种拦截请求的技术做一个对比讲解&#xff01; 回顾: 过滤器Filter详解 拦截器Interceptor详解 一、过滤器 Filter Filter&#xff0c;中文名过滤器&#xff0c;是 Servlet 规范中定义…

2025 SSM与SpringBoot计算机毕业设计选题推荐【2025Java方向】

文末有博主联系方式 在选择计算机毕业设计题目时&#xff0c;选一个合适的方向和技术栈非常重要。对于使用Java方向的SSM&#xff08;Spring、Spring MVC、MyBatis&#xff09;和Spring Boot技术的开发项目&#xff0c;这里为大家整理了50个精选的毕业设计题目&#xff0c;供2…

tushare库简介及数据获取方法

文章目录 tushare库简介tushare使用方法接口数据获取实例获取交易日历股票基础信息沪股通和深股通成份股上市公司基础信息获取新股上市列表数据A股日线行情A股周线行情A股月线行情股票每日指标&#xff0c;选股分析 tushare库简介 tushare库是一个用于抓取中国股票的历史和实时…

性能测试笔记1

为什么要进行性能测试&#xff1f;&#xff08;在真实项目商用时&#xff0c;需要大量的用户进行使用&#xff0c;因此需要模拟大量用户的使用场景 &#xff09; 1、业务需求 电商双 11 活动 / 微信春晚抢红包 /12306 春运订票 当前服务器配置是否支持 20000 人同时使用 技术…

【rCore OS 开源操作系统】Rust 练习题题解: Structs

【rCore OS 开源操作系统】Rust 练习题题解: Structs 摘要 rCore OS 开源操作系统训练营学习中的代码练习部分。 在此记录下自己学习过程中的产物&#xff0c;以便于日后更有“收获感”。 后续还会继续完成其他章节的练习题题解。 正文 structs1 题目 // structs1.rs // //…

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【下篇】

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【下篇】 一、上篇回顾二、项目准备2.1 准备模板项目2.2 支持计时功能2.3 配置UART4引脚2.4 支持printf重定向到UART42.5 支持printf输出浮点数2.6 支持printf不带\r的换行2.7 支持ccache编译缓存 三、TFLM集成3.1 添加tfli…