【Web】Javascript中的this陷阱(二)
来源:互联网 发布:忽略此网络如何恢复 编辑:程序博客网 时间:2024/06/05 00:08
本节接着上一篇进行整理,上一篇链接如下:
http://blog.csdn.net/whuzxq/article/details/63265901
1.object this
在一个对象的一个函数里,你可以通过this来引用这个对象的其他属性。这个用new来新建一个实例是不一样的。
var obj = { foo: "bar", logFoo: function () { console.log(this.foo); } }; obj.logFoo(); //logs "bar"
注意,没有使用new,没有使用Object.create,也没有使用函数调用创建一个对象。你也可以将对象当作一个实例将函数绑定到上面。
var obj = { foo: "bar" }; function logFoo() { console.log(this.foo); } logFoo.apply(obj); //logs "bar"
当你用这种方式使用this的时候,并不会越出当前的对象。只有有相同直接父元素的属性才能通过this共享变量
var obj = { foo: "bar", deeper: { logFoo: function () { console.log(this.foo); } } }; obj.deeper.logFoo(); //logs undefined
你可以直接通过对象引用你需要的属性
var obj = { foo: "bar", deeper: { logFoo: function () { console.log(obj.foo); } }};obj.deeper.logFoo(); //logs "bar"
2.DOM event this
在一个HTML DOM事件处理程序里面,this始终指向这个处理程序被所绑定到的HTML DOM节点
function Listener() { document.getElementById("foo").addEventListener("click", this.handleClick); } Listener.prototype.handleClick = function (event) { console.log(this); //logs "<div id="foo"></div>" } var listener = new Listener(); document.getElementById("foo").click();
除非你自己通过bind切换了上下文
function Listener() { document.getElementById("foo").addEventListener("click", this.handleClick.bind(this)); } Listener.prototype.handleClick = function (event) { console.log(this); //logs Listener {handleClick: function} } var listener = new Listener(); document.getElementById("foo").click();
3.HTML this
在HTML节点的属性里面,你可以放置JavaScript代码,this指向了这个元素
<div id="foo" onclick="console.log(this);"></div> <script type="text/javascript"> document.getElementById("foo").click(); //logs <div id="foo"... </script>
override this
你不能重写this,因为它是保留字。
function test () { var this = {}; // Uncaught SyntaxError: Unexpected token this }
eval this
你可以通过eval来访问this
function Thing () {}Thing.prototype.foo = "bar";Thing.prototype.logFoo = function () { eval("console.log(this.foo)"); //logs "bar"}var thing = new Thing();thing.logFoo();
这会造成一个安全问题,除非不用eval,没有其他方式来避免这个问题。
在通过Function来创建一个函数的时候,同样能够访问this
function Thing () {}Thing.prototype.foo = "bar";Thing.prototype.logFoo = new Function("console.log(this.foo);");var thing = new Thing();thing.logFoo(); //logs "bar"with this
0 0
- 【Web】Javascript中的this陷阱(二)
- 【Web】JavaScript中的this陷阱(一)
- JavaScript中的this使用(二)
- JavaScript中的this陷阱的最全收集
- JavaScript中的this陷阱的最全收集--没有之一
- JavaScript中的this陷阱的最全收集
- JavaScript 中的 this 陷阱的最全收集 - 没有之一
- JavaScript中的this陷阱的最全收集
- JavaScript中的this陷阱的最全收集
- JavaScript中的this陷阱的最全收集
- javascript this指针的陷阱
- JavaScript的this机制与箭头函数(二)——箭头函数中的this
- Web浏览器中的JavaScript(二)
- Web浏览器中的JavaScript(二)
- 注意! JavaScript中的"陷阱"
- JavaScript中的"陷阱"
- 注意! JavaScript中的"陷阱"
- JavaScript 中的陷阱
- Ext基础
- 编程第十二天
- robocode 创建机器人
- a 标签中调用js的几种方法
- 杭电某某 解法一 3.11
- 【Web】Javascript中的this陷阱(二)
- PAT-A1110. 二叉树-完全二叉树的判断
- Android:Android 6.0+权限适配--简单粗暴
- 转接IC XC6131:ISP数字图像处理芯片
- HDU1501&&ZOJ2401-Zipper
- 软件体系结构前四周课程总结
- javascript之dom操作
- L2-011. 玩转二叉树
- 验证码