美文网首页
[JS] 致命缺陷function和变量容易被覆盖

[JS] 致命缺陷function和变量容易被覆盖

作者: objcat | 来源:发表于2019-03-28 10:03 被阅读0次

前言

Javascript是我们开发中比较常见的语言, 但是由于的一些特性比如, 定义过的变量还可以定义, 定义过的函数也可以定义, 并且重复之后还没有任何的错误提示, 从而导致程序中会经常会出现一些方法和变量被覆盖的错误, 为了解决这些错误程序中引入命名空间来区分不同作用域之间的函数, 但是js中并没有命名空间, 所以我们要用js中的其他特性来代替, 以解决代码中的重名问题.

正文

我们先看一个例子, 在浏览器环境中有个函数叫alert("hello world!"), 我们先看一下效果

之后我们来重写一下alert

function alert() {
        console.log("hahah i am alert");
}

我们发现原来的alert就被覆盖了, 而且没有任何错误提示或警告, 这在程序中经常会导致莫名其妙的错误, 接下来我们就着手开始优化代码, 让代码不那么容易重复.

方法1:使用对象来解决问题

var _person = {};
_person.name = 'red';
_person.say = function say() {
    console.log("hello world");
};
window.person = _person;
<script>
    person.say();
    console.log(person.name);
</script>

输出结果:

image.png

由于js中可以动态添加对象的成员和function所以我们利用这个特点来把函数封装起来, 这样就不太容易重复, 但是这么写多多少少也有些问题, _person是暴露在大庭广众之下的, 我们来给他添加一个作用域.

(function () {
    var _person = {};
    _person.name = 'zhagnsan';
    _person.say = function say() {
        console.log("hello world");
    };
    window.person = _person;
})();

我们使用下面写法来包裹一点代码, 这样就不会出现变量重名的问题了, 因为这个变量只活在自己的作用域中.

(function () {
   // your code
})();

这个东西在js中叫做立即执行函数, 举个例子

我们想要执行一个函数需要这样

function haha() {
    console.log(666);
}
haha();

我们用立即执行函数就可以这么写

(function () {
    console.log(666);
})();

由于函数都有自己的作用域, 所以在这里面的变量不用担心被覆盖的问题, 这也就是变相的实现了命名空间, 其实说白了就是创建了个对象, 让它去执行你要完成的功能, 这比暴露在大庭广众之下要好吧!

方法2:使用函数来解决问题

(function () {
    var _person = function () {};
    _person.prototype.name = 'lisi';
    _person.prototype.say = function () {
        console.log("hello world");
    };
    window.person = new _person();
})();

函数有个叫做prototype的属性, 可以动态的添加成员变量和方法, 所以也不会造成命名冲突的问题, 只要把对象起一个不常用的名字可以在很大程度上避免明明冲突问题, 如有错误请在留言中指出, 我会在第一时间修正.

finally enjoy it

by objcat 2019.03.28

相关文章

  • [JS] 致命缺陷function和变量容易被覆盖

    前言 Javascript是我们开发中比较常见的语言, 但是由于的一些特性比如, 定义过的变量还可以定义, 定义过...

  • 模块与包管理工具

    js的天生缺陷——缺少模块化管理机制 ·表现>> JS中容易出现变量被覆盖,方法被替代的情况(既被污染)。特别是存...

  • js 执行上下文

    在运行fn之前,变量和function都会提前声明,但是function会覆盖变量(在不赋值的前提下)

  • 前端知识点(11)

    JS函数 function aa(){ alert('hell'); } aa()直接调用 变量和函数...

  • 闭包

    作用域 js中变量分为全局变量、局部变量 预解析 js会把带有var和function关键字的事先声明,并在存放在...

  • JS笔记 命名问题

    JS中函数和变量重名时,后声明的覆盖先声明的,后赋值的覆盖先赋值的。 变量提升和函数提升时,变量的声明是在函数的声...

  • JS中的提升

    JS中包含两种提升,变量提升和函数提升。 变量提升 变量提升只能是var或者function声明的变量或者函数,l...

  • 架构师之路-MVC模式

    MVC的致命缺陷:容易引起内存泄漏由于Activity(Controller层)与VIew层和Model层之间的交...

  • Javascript最精简教程

    js语法万能结构 变量一律用 var 表示,定义变量的格式和java一致。 函数写法: function xxxx...

  • javascript之为什么要用let代替var

    javascript中用 var 声明变量,存在以下问题: 声明的变量为全局变量(被誉为JS最大设计缺陷之一): ...

网友评论

      本文标题:[JS] 致命缺陷function和变量容易被覆盖

      本文链接:https://www.haomeiwen.com/subject/vqefbqtx.html