首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免在javascript (ES5/ES6)中使用“this”指针?

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

Stack Overflow用户
提问于 2015-06-01 17:33:08
回答 2查看 340关注 0票数 1

根据克罗克福德的说法,由于安全问题,最好的做法是不要使用这个指针。

我在余烬指南里发现了这个,

代码语言:javascript
复制
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!"

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-01 18:34:57

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

不完全同意。他的论点是,您不能在不安全的环境中信任this,因为它是由调用方决定的。这都是关于封装,以及您的方法只做您希望它们做的事情的安全性。确实使用this的方法可能会被骗去做其他的事情。

考虑一下

代码语言:javascript
复制
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的恶意调用者可以执行以下操作

代码语言:javascript
复制
p.say.call({name: "Douglas"}, "this is totally safe");

(假设他无法访问alert,并假定他不想简单地更改p.name)

一个更安全的构造函数应该是

代码语言:javascript
复制
function Person(name) {
    return {
        say: function(thing) {
            alert(this.name+" says: "+thing);
        }
    };
}

因此,当一个恶意代理被传递给Person("John")时,他只能让John说些什么。

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

不用谢。成员拥抱this,它是非常有用的,你应该使用它,因为你应该被框架。

票数 3
EN

Stack Overflow用户

发布于 2015-06-01 18:33:50

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

他并不是说this在一般情况下会导致安全性差,而只是在沙箱的情况下。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30579660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档