JavaScript 中 this 指向全局对象会有什么问题◔ ‸◔?
怪我咯
怪我咯 2017-04-11 12:19:38
[JavaScript讨论组]

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

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

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

怪我咯
怪我咯

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

全部回复(7)
巴扎黑

简单来说,

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

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

ringa_lee

这个是有所影响的.

若在兼容模式下, 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'
巴扎黑

怕污染全局变量

黄舟
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!
ringa_lee

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

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

巴扎黑

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

:-)

怪我咯

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号