您的位置:首页 > Web前端 > JavaScript

理解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;
}
}
}
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"


对于第一行代码无疑问。第二行代码相当于引用一个函数,结果不变。而第三行先将函数变量赋值给了他自己,在调用结果发生了变化,这就是意外变化了,我没想明白是为什么。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息