JavaScript 中 this 指向全局对象会有什么问题◔ ‸◔?

Rachel
  • 361

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

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

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

回复
阅读 4.2k
7 个回答

简单来说,

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

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

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

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

怕污染全局变量

dollor
  • 2.1k
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!

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

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

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

:-)

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏