JavaScript 中 this 指向全局对象会有什么问题◔ ‸◔?
怪我咯
怪我咯 2017-04-11 12:19:38
0
8
448

在 阮一峰的 《Javascript 严格模式详解》这篇文章中,4.3节 增强的安全措施 有提到use strict严格模式中,会禁止this关键字指向全局对象。既然这是一个安全措施,那么在正常模式中,this关键字指向全局对象是不是有什么安全隐患?

-------------------- 2017/3/17 “诈帖”分割线 --------------------
各位不好意思,正在清理未解决问题。如有打扰,请谅解。
回看这个问题,大家回答的大体上来说都是由于代码在编写过程中的疏忽或者说意外导致this的指向发生了变化,从而导致相关数值发生变化。这可能会导致程序出现BUG或者一些意料之外的行为。
我当初在提出这个问题的时候,内心对于安全隐患这个词语预先的设定时类似于:漏洞。可能被人利用的漏洞,从而导致一些牵扯到系统安全或者用户账号安全的问题出现。

现在想请教大家,this指向全局对象会牵扯到这方面的安全问题吗?

怪我咯
怪我咯

走同样的路,发现不同的人生

全員に返信 (8)
巴扎黑

简单来说,

function Point(x,y){ this.x = x;this.y=0; }

你希望是这样调用p = new Point(1,2);,可是不小心写成p = Point(1,2)不会报错,却不会出现你希望的结果。

いいねを押す+0
    左手右手慢动作

    这个是有所影响的.

    若在兼容模式下, this的指向可能会被污染.原本你的意图可能是想this指向对象本身, 但在传递变量时, 很有可能会把this的指向给改变了, 导致this指向其他或window.这里即称为this污染.

    例如:

    function Person(name, age){ this.name = name; this.age = age; } Person.prototype.getName = function(){ return this.name; } var p = new Person('james', 30); var getName = p.getName; console.log(getName()); // 输出为: '' console.log(p.getName()); // 输出为: 'james'
    いいねを押す+0
      大家讲道理

      Javascript语言的一个特点,就是允许"动态绑定",即某些属性和方法到底属于哪一个对象,不是在编译时确定的,而是在运行时(runtime)确定的。
      严格模式对动态绑定做了一些限制。某些情况下,只允许静态绑定。也就是说,属性和方法到底归属哪个对象,在编译阶段就确定。这样做有利于编译效率的提高,也使得代码更容易阅读,更少出现意外。

      可以参考下边的文章:
      http://www.ruanyifeng.com/blo...

      いいねを押す+0
        巴扎黑

        怕污染全局变量

        いいねを押す+0
          黄舟
          var task = { run:function(){ this.command() }, run2:function(){ (function(){ this.command() })(); }, command:function(){ console.log('不要慌,这只是演习。'); } } window.command = function(){ console.log('引爆核弹!'); }; task.run();//虚惊一场 task.run2();//boom! var run = task.run; run();//boom!
          いいねを押す+0
            左手右手慢动作

            比如你做了个配置 config = {reqUrl:"xxxxx"}

            这个config如果暴露在全局,是可以随便改里面的东西的,如果你的request地址在里面也是可以改的

            いいねを押す+0
              巴扎黑

              函数执行时,对应的上下文入栈,也就是this绑定到此时的上下文。
              返回函数嵌套返回的时候,this 会指向window, 执行上下文发生改变。
              函数是有作用域的,外部函数不能访问内部函数的变量和方法,由此会产生一系列的问题。
              这也就是 var self/that = this ;等写法出现的原因。 就是要保存一个索引,防止指向window。

              :-)

              いいねを押す+0
                刘奇

                我觉得楼主主要想问这与“安全”有什么关系?
                禁止this指向全局,可以防止因为误用this而修改到了全局变量,这样可以保护“代码的安全”。

                いいねを押す+0
                  最新のダウンロード
                  詳細>
                  ウェブエフェクト
                  公式サイト
                  サイト素材
                  フロントエンドテンプレート
                  私たちについて 免責事項 Sitemap
                  PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!