根据Crockford的说法,由于安全问题,最佳做法是不使用此指针。
我在Ember guide,
中找到了这个Person = Ember.Object.extend({
say: function(thing) {
var name = this.get('name');
alert(name + " says: " + thing);
}
});
Soldier = Person.extend({
say: function(thing) {
this._super(thing + ", sir!");
}
});
var yehuda = Soldier.create({
name: "Yehuda Katz"
});
yehuda.say("Yes"); // alerts "Yehuda Katz says: Yes, sir!"
在这种代码情况下如何避免这种情况?
答案 0 :(得分:3)
由于安全问题,最佳做法是不使用此指针。
不完全是。他的论点是你不能在不安全的环境中信任display: none;
,因为它是由来电者决定的。它完全取决于封装,以及您的方法只能按照您希望的方式执行的安全性。使用this
的方法可能会被欺骗做其他事情。
考虑
this
有权访问function Person(name) {
this.name = name;
this.say = function(thing) {
alert(this.name+" says: "+thing);
};
}
var p = new Person("John");
p.say("this is unsafe");
的恶意来电者可以
p
(假设他无法访问p.say.call({name: "Douglas"}, "this is totally safe");
,并假设他不想简单地改变alert
)
更安全的构造函数是
p.name
因此,当恶意代理人通过function Person(name) {
return {
say: function(thing) {
alert(this.name+" says: "+thing);
}
};
}
时,他只能让Person("John")
说些什么。
在这种代码情况下如何避免这种情况?
完全没有。 Ember拥抱John
,它确实非常有用,你应该按照框架应该使用它。
答案 1 :(得分:2)
在您引用的视频中,Crockford表示使用this
导致实施JavaScript沙箱的特定情况的安全性较差允许第三方代码运行安全地,例如Facebook允许广告在Facebook的页面上运行他们自己的JavaScript,而不会损害用户的利益。安全。从代码中删除this
是阻止代码访问window
对象的简单方法,这在这种沙盒环境中是必需的。
他没有说this
导致一般情况下的安全性较差,但在沙盒的情况下仅 。
他确实说过,自从使用这样一个系统后,他已经停止在自己的代码中使用this
,但他并没有详细说明这一点,而且这不是对一般JavaScript的评论安全