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

How to avoid using 'this' pointer in javascript (ES5/ES6)?

本文关键字:ES5 ES6 javascript this 何避免 指针      更新时间:2023-09-26

根据Crockford的说法,由于安全问题,最佳实践是不使用此指针。

我在烬指南中找到了这个,

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

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

由于安全问题,最佳实践是不使用该指针。

不完全是。他的论点是,您不能在不安全的环境中信任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"),那么他只能让John说些什么。

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

一点也不。Ember包含this,它确实非常有用,你应该按照框架的要求使用它。

在你提到的视频中,Crockford说使用this会导致安全性差,在特定情况下实现JavaScript沙箱以允许第三方代码安全运行,例如Facebook允许广告在Facebook页面上运行自己的JavaScript而不损害用户的安全。从代码中消除this是防止代码访问window对象的一种简单方法,这在这种沙盒环境中是必要的。

没有this在一般情况下导致安全性差,但只在沙盒的情况下

他确实说过,自从使用这样的系统以来,他已经停止在自己的代码中使用this,但他没有详细说明这一点,而且这不是对一般JavaScript安全性的评论。