zoukankan      html  css  js  c++  java
  • 利用DMZ对象保护全局变量

    今天偶然看到this绑定有个比较例外的例子会直接忽略指定的绑定对象。

    当给apply/call/bind传入null或undefined时会出现这种情况:

    function foo(){
        console.log(this.a);
    }
    
    var a=2;
    
    // 传入null
    foo.apply(null);      // 2

    非严格模式下foo函数中的this被默认绑定到全局对象(只要函数体(不是函数调用位置)处于严格模式下,会绑定到undefined),自然输出就是2。

    如果此时全局a被篡改就麻烦了,例如:

    function foo(){
        this.a="linwei";
    }
    
    var a=2;
    
    // 传入null
    foo.apply(null);
    
    console.log(a);     // linwei

    此时全局a就被篡改了,可能会引发bug。

    此时可以用一个DMZ(Demilitarized zone,非军事区)对象来保护全局变量,这个DMZ对象本质上是一个“裸”对象(详见贺老的文章http://hax.iteye.com/blog/1663476):

    function foo(){
        this.a="linwei";
    }
    
    // 创建DMZ对象
    var empty=Object.create(null);
    
    var a=2;
    
    
    foo.apply(empty);
    
    console.log(a);     // 2,不会被篡改成"linwei"

    这样就达到保护全局变量a的目的。

    如果函数并不关心this值,可以传入一个比null更安全的占位值,DMZ对象将是一个更安全的选择。

  • 相关阅读:
    CSS3 transition 过度
    CSS3 2D转换
    jQuery 选择器
    bootstrap、qjuery、插件 、字体网页
    利用jquery.backstretch插件,背景切换
    js 背景自动切换
    Jquery
    分析动态网页请求爬取腾讯视频评论
    追女神助手v0.1
    动态加载网页的爬取总结
  • 原文地址:https://www.cnblogs.com/linweinb/p/8270780.html
Copyright © 2011-2022 走看看