如何避免在javascript(ES5 / ES6)中使用'this'指针?

时间:2015-06-01 17:33:09

标签: javascript ember.js web

根据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!"

在这种代码情况下如何避免这种情况?

2 个答案:

答案 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的评论安全