理解js中的this对象
2016-04-04 09:45
375 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">关于this对象,一直不是很好理解,我也经常被困惑,因为this对象经常会因为代码书写的方式不同而导致似乎自己认知中的this对象被改变了,但实际上this还是那个this。一句话:“this 对象是函数在运行时基于函数的执行环境而绑定的”。如在全局环境中执行的函数,this就等于window,而当使用object调用函数时this就执行了这个object。</span>
好了,接下来就说说上面说的“因为代码书写的不同,而导致的this对象不好理解”,看看下面一段代码:
var name = "window's name";
var object = {
name:"object's name",
getFunc:function(){
return function(){
this.name;
}
}
}
执行上面的函数结果是window's name。对于这个结果,懂的人一下就理解了,但是我刚开始,没懂。现在想想也理解了。
解释:函数被调用的时候都会取得this和arguments。但是就像作用域链一样函数向外开始搜索时,当搜索到自己的活动对象时,就停止了,而这个函数中this活动对象就是window,所以就出现了如上结果。
解决办法:利用闭包,将this保存在一个变量中
var name = "window's name";
var object = {
name:"object's name",
getFunc:function(){
<span style="white-space:pre"> </span>var that = this;
return function(){
that.name;
}
}
}
最后再写一下意想不到的this
var name = "window's name";
var object = {
name:"object's name",
getName:function(){
return this.name;
}
}
对于第一行代码无疑问。第二行代码相当于引用一个函数,结果不变。而第三行先将函数变量赋值给了他自己,在调用结果发生了变化,这就是意外变化了,我没想明白是为什么。
好了,接下来就说说上面说的“因为代码书写的不同,而导致的this对象不好理解”,看看下面一段代码:
var name = "window's name";
var object = {
name:"object's name",
getFunc:function(){
return function(){
this.name;
}
}
}
console.log(object.getFunc()());//"window's name"
执行上面的函数结果是window's name。对于这个结果,懂的人一下就理解了,但是我刚开始,没懂。现在想想也理解了。
解释:函数被调用的时候都会取得this和arguments。但是就像作用域链一样函数向外开始搜索时,当搜索到自己的活动对象时,就停止了,而这个函数中this活动对象就是window,所以就出现了如上结果。
解决办法:利用闭包,将this保存在一个变量中
var name = "window's name";
var object = {
name:"object's name",
getFunc:function(){
<span style="white-space:pre"> </span>var that = this;
return function(){
that.name;
}
}
}
console.log(obj.getFunc()());//"object's name"这个时候达到了我们想要的结果。
最后再写一下意想不到的this
var name = "window's name";
var object = {
name:"object's name",
getName:function(){
return this.name;
}
}
console.log(obj.getName());//"object's name"
<pre name="code" class="html">console.log((obj.getName)());//"object's name"
console.log((obj.getName = obj.getName)());//"window's name"
对于第一行代码无疑问。第二行代码相当于引用一个函数,结果不变。而第三行先将函数变量赋值给了他自己,在调用结果发生了变化,这就是意外变化了,我没想明白是为什么。
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- Python动态类型的学习---引用的理解
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解