javascript中,对于this指向的浅见
2016-07-09 17:38
253 查看
# this的指向在函数创建的时候确定不了。只有在执行的时候,才可以确定。
## 1 、 这里的this指向window window.fn(); 所以this.user是undefined
## 2、谁调用,指向谁
## 3、
## 4、
- 如果函数中有this,但是他没被上一级的对象所跳用,这时this指向window
- 如果函数中有this,并且这个函数被上一级对象所调用,这时this指向上一级的对象
- 如果函数中有this,而且这个函数内部有多个对象,尽管这个函数被最外层所调用,
- 但是this的指向也只是他的上一级对象。
- 严格模式中,this不指向window,而是undefined
## 5、 注释掉a:12 this.a为 undefined
- 尽管对象b中,没有属性a,但是这个this也是指向对象b,因为this只会指向
- 它的上一级对象,不管该对象有没有a
## 6、this指向的永远都是最后调用它的对象(执行的时候,谁调用)
- 注意:虽然,函数中的fn被对象b所引用,但是在赋值的时候,并没有执行,
- 所以最终的指向是window
- 上面的例子不同,因为上面的例子直接执行了fn()
## 7、构造函数中的this
- 之所以对象a可以用函数Fn中的uesr,是因为new关键字改变了this的指向。
- new 关键字创建了一个对象实例, 相当于复制了一份Fn到对象a中。
- 此时,只是创建,没有执行。
- 最后调用的是fn,那么this指向自然是fn
- 首先,new关键字会创建一个空对象
- 然后会自动调用一个函数的apply方法,将this指向这个空对象,这样函数内部的this就会被这个空对象所替代。
- bind apply(数组) call
## 8、构造函数 return 对象 的时候
- 返回一个对象的时候,this会指向返回的对象
## 9、return 简单类型的数据
- 返回简单类型数据,this还是指向函数的实例
## 10、return null的时候
- 注意:返回null虽然是个对象,this还是指向函数的实例,null特殊
## 1 、 这里的this指向window window.fn(); 所以this.user是undefined
function fn (){ var user='追梦人'; console.log(this.user); // undefined console.log(this); // window } fn();
## 2、谁调用,指向谁
var o ={ user:'追梦人', fn:function(){ console.log(this.user); // 谁调用,指向谁 } } o.fn();
## 3、
var o ={ user:'追梦人', fn:function(){ console.log(this.user); // 为什么不是undefiend,是window在调用 } } window.o.fn(); // 谁调用,指向谁
## 4、
var o={ a:10, b:{ a:12, fn:function(){ console.log(this.a); // 12 }, }, } o.b.fn();
- 如果函数中有this,但是他没被上一级的对象所跳用,这时this指向window
- 如果函数中有this,并且这个函数被上一级对象所调用,这时this指向上一级的对象
- 如果函数中有this,而且这个函数内部有多个对象,尽管这个函数被最外层所调用,
- 但是this的指向也只是他的上一级对象。
- 严格模式中,this不指向window,而是undefined
## 5、 注释掉a:12 this.a为 undefined
var o={ a:10, b:{ //a:12, fn:function(){ console.log(this.a); }, }, } o.b.fn();
- 尽管对象b中,没有属性a,但是这个this也是指向对象b,因为this只会指向
- 它的上一级对象,不管该对象有没有a
## 6、this指向的永远都是最后调用它的对象(执行的时候,谁调用)
var o={ a:10, b:{ a:12, fn:function(){ console.log(this.a); // undefined console.log(this); // window }, }, } var fn=o.b.fn; // 注意:这里并没有执行 fn(); // 执行fn
- 注意:虽然,函数中的fn被对象b所引用,但是在赋值的时候,并没有执行,
- 所以最终的指向是window
- 上面的例子不同,因为上面的例子直接执行了fn()
## 7、构造函数中的this
function Fn(){ this.user="追梦人"; } var fn = new Fn(); console.log(fn.user);
- 之所以对象a可以用函数Fn中的uesr,是因为new关键字改变了this的指向。
- new 关键字创建了一个对象实例, 相当于复制了一份Fn到对象a中。
- 此时,只是创建,没有执行。
- 最后调用的是fn,那么this指向自然是fn
- 首先,new关键字会创建一个空对象
- 然后会自动调用一个函数的apply方法,将this指向这个空对象,这样函数内部的this就会被这个空对象所替代。
- bind apply(数组) call
## 8、构造函数 return 对象 的时候
function Fn(){ this.user="追梦人"; return {} // 返回 一个对象 } var fn = new Fn(); console.log(fn.user); // undefined
- 返回一个对象的时候,this会指向返回的对象
## 9、return 简单类型的数据
function Fn(){ this.user="追梦人"; return 1; // 返回的是一个简单类型 } var fn = new Fn(); console.log(fn.user); // 追梦人
- 返回简单类型数据,this还是指向函数的实例
## 10、return null的时候
function Fn(){ this.user="追梦人"; return null; // 返回的是一个简单类型 } var fn = new Fn(); console.log(fn.user); // 追梦人
- 注意:返回null虽然是个对象,this还是指向函数的实例,null特殊
相关文章推荐
- JS经验
- arcgis api for javascript 4.0 入门学习(1)创建一个2D地图
- JSP教程【2】JSP基本语法
- 深入浅析JavaScript函数前面的加号和叹号
- JS的几种创建函数方式
- 15javascript的Event对象
- 14javascript操作style对象
- javascript中DOM元素的属性方法
- 13javascript添加删除div,对象的方法
- 12javascript操作CSS
- 11window对象的属性和方法
- 10document对象的属性和方法
- 9Table表和列表
- 8string Math date history计时器对象
- 用JS获取地址栏参数的方法
- 字典里有个数组,数组里面存放着几个不相同的字典模型怎么用MJExtension解析,
- 7Cookie的使用
- JS利用正则配合replace替换指定字符
- javascript数组去重的两个方法
- 谈谈Js对象的那些事儿