在 阮一峰的 《Javascript 严格模式详解》这篇文章中,4.3节 增强的安全措施 有提到use strict严格模式中,会禁止this关键字指向全局对象。既然这是一个安全措施,那么在正常模式中,this关键字指向全局对象是不是有什么安全隐患?
-------------------- 2017/3/17 “诈帖”分割线 --------------------
各位不好意思,正在清理未解决问题。如有打扰,请谅解。
回看这个问题,大家回答的大体上来说都是由于代码在编写过程中的疏忽或者说意外导致this的指向发生了变化,从而导致相关数值发生变化。这可能会导致程序出现BUG或者一些意料之外的行为。
我当初在提出这个问题的时候,内心对于安全隐患这个词语预先的设定时类似于:漏洞。可能被人利用的漏洞,从而导致一些牵扯到系统安全或者用户账号安全的问题出现。
现在想请教大家,this指向全局对象会牵扯到这方面的安全问题吗?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
简单来说,
你希望是这样调用
p = new Point(1,2);,可是不小心写成p = Point(1,2)不会报错,却不会出现你希望的结果。这个是有所影响的.
若在兼容模式下, this的指向可能会被污染.原本你的意图可能是想this指向对象本身, 但在传递变量时, 很有可能会把this的指向给改变了, 导致this指向其他或window.这里即称为this污染.
例如:
怕污染全局变量
比如你做了个配置 config = {reqUrl:"xxxxx"}
这个config如果暴露在全局,是可以随便改里面的东西的,如果你的request地址在里面也是可以改的
函数执行时,对应的上下文入栈,也就是this绑定到此时的上下文。
返回函数嵌套返回的时候,this 会指向window, 执行上下文发生改变。
函数是有作用域的,外部函数不能访问内部函数的变量和方法,由此会产生一系列的问题。
这也就是 var self/that = this ;等写法出现的原因。 就是要保存一个索引,防止指向window。
:-)
我觉得楼主主要想问这与“安全”有什么关系?
禁止this指向全局,可以防止因为误用this而修改到了全局变量,这样可以保护“代码的安全”。