JavaScript中的this基本问题实例小结
本文实例讲述了JavaScript中的this基本问题.分享给大家供大家参考,具体如下
在函数中 this 到底取何值,是在函数真正被调用执行的时候确定下来的,函数定义的时候确定不了。
执行上下文环境
定义执行函数的时候,会产生一个上下文的对象,里面保存变量,函数声明和this。
作用用来保存本次运行时所需要的数据
当你在代码中使用了 this,这个 this 的值就直接从执行的上下文中获取了,而不会从作用域链中搜寻。
关于 this 的取值,大体上可以分为以下几种情况
情况一全局 & 调用普通函数
在全局环境中,this 永远指向 window。
console.log(this === window); //true
普通函数在调用时候(注意不是构造函数,前面不加 new),其中的 this 也是指向 window。
如果在严格模式下调用的话会报错
var x = 1; function first(){ console.log(this); // undefined console.log(this.x); // Uncaught TypeError: Cannot read property 'x' of undefined } first();
情况二构造函数
所谓的构造函数就是由一个函数 new 出来的对象,一般构造函数的函数名首字母大写,例如像 Object,Function,Array 这些都属于构造函数。
function First(){ this.x = 1; console.log(this); //First {x:1} } var first = new First(); console.log(first.x); //1
上述代码,如果函数作为构造函数使用,那么其中的 this 就代表它即将 new 出来的对象。
如果直接调用 First函数,而不是 new First(),那就变成情况1,这时候 First() 就变成普通函数。
function First(){ this.x =1; console.log(this); //Window } var first = First(); console.log(first.x); //undefined
情况三对象方法
如果函数作为对象的方法时,方法中的 this 指向该对象。
var obj = { x: 1, first: function () { console.log(this); //Object console.log(this.x); //1 } }; obj.first();
注意若是在对象方法中定义函数,那么情况就不同了。
var obj = { x: 1, first: function () { function second(){ console.log(this); //Window console.log(this.x); //undefined } second(); } } obj.first();
可以这么理解函数 second虽然是在 obj.first 内部定义的,但它仍然属于一个普通函数,this 仍指向 window。
在这里,如果想要调用上层作用域中的变量 obj.x,可以使用 self 缓存外部 this 变量。
var obj = { x:1, first: function () { var self = this; function second(){ console.log(self); //{x: 1} console.log(self.x); //1 } second(); } } obj.first();
如果 first 函数不作为对象方法被调用
var obj = { x: 1, first: function () { console.log(this); //Window console.log(this.x); //undefined } }; var fn = obj.first; fn();
obj.first 被赋值给一个全局变量,并没有作为 obj 的一个属性被调用,那么此时 this 的值是 window。
情况四构造函数 prototype 属性
function First(){ this.x = 1; } First.prototype.getX = function () { console.log(this); //First {x: 1, getX: function} console.log(this.x); //1 } var first= new First(); first.getX();
在 First.prototype.getX 函数中,this 指向的first 对象。不仅仅如此,即便是在整个原型链中,this 代表的也是当前对象的值。
情况五函数用 call
var obj = { x:1 } function first(){ console.log(this); //{x: 1} console.log(this.x); //1 } first.call(obj);
当一个函数被 call调用时,this 的值就取传入的对象的值。
来源知乎
链接https://zhuanlan.zhihu./p/25294187?utm_source=.youdao.note&utm_medium=social
感兴趣的朋友可以使用在线HTML/CSS/JavaScript前端代码调试运行工具测试上述代码运行效果。
更多关于JavaScript相关内容还可查看本站专题《》、《》、《》、《》及《》
希望本文所述对大家JavaScript程序设计有所帮助。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程