如何避免使用'this'指针在javascript (ES5/ES6)
How to avoid using 'this' pointer in javascript (ES5/ES6)?
根据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安全性的评论。
相关文章:
- Unexpected Transpile ES6>ES5
- 有没有办法将包含 es6 的字符串转换为 es5
- 使用 Babel 将 ES6 模块转换为 ES5 AMD 模块,无法按预期工作
- 如何导入“;旧的“;ES6中的ES5代码
- 使用ES5阵列方法和ES6生成器
- 为什么我需要的库没有从ES6转换到ES5
- ES6 -- 导入 es5 文件
- 重构作为属性从 es5 传递到 es6 的函数
- 使用 ES5 和 ES6 将输入注入组件构造函数
- Sublime Text:JavaScript ES5 与 ES6 的不同片段
- 使用 babel 将 es6 转换为 es5,然后与 Browserify 捆绑
- 我可以在没有npm、VS、Node等的情况下为ES6-ES5进行Transpile吗
- 在ES6应用程序中对库源映射进行网络打包时出错,可在ES5应用程序中使用
- 为ES5或ES6中对象的嵌套属性简明定义Getter和Setter
- Javascript、CoffeeScript、TypeScript、ES5和ES6之间的关系
- 为什么我的webpack配置的es6版本会给我一个错误,而es5版本却没有;t
- ES6到ES5转发器
- ES6类与ES5类有多少不同
- Angular 1.x, ES5/ES6 and testing with Karma
- 如何避免使用'this'指针在javascript (ES5/ES6)