在工作过程当中,我们经常会碰到有关于this这个关键字,尤其是在封装插件的时候,如果对于this的指代不理解或者一知半解,就会导致我们项目中,后续出现各种各样的问题,下面就说说我自己对于this关键字的理解
关于this的指向,我们始终记住一句话,那就是“this的指向,在函数定义的时候是确定不了的,只有在函数调用的时候,我们才能知道this指向”;如何理解这句话呢?如下所示:
function A(){
var name="hello";
this.age=12;
console.log(this.age);
};
A(); //12;
在上面这个例子中,函数执行完后,会打印出12;因为此时定义的函数A是在window作用域下定义的,所以在执行A的时候,我们可以理解成此时是window调用了A函数,所以在非严格状态下,此时的this指向的是window;
再来看一个例子:
var name="haimei"
var object={
name:"lilei",
getName:function(){
console.log(this.name);
}
};
object.getName();//lilei;
上述这个例子中,函数getName()被object调用的,所以在执行函数的时候,会打印出"lilei";
我们再来看一个例子:
var name="haimei"
var object={
name:"lilei",
people:{
name:"tom",
getName:function(){
console.log(this.name);
}
}
};
object.people.getName(); // ?
各位看官可以想想这个时候,打印出来的会是什么?
在上面这个例子中,最终打印出来的会是tom;
先简单总结一下:
1:如果在一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window;
2:如果一个函数中有this,这个函数被上级对象所调用,那么this指向的就是上级对象;
3:如果一个函数中有this,这个函数是被多个对象所包裹的(即:这个函数的父级是一个对象,它的父级的父级也是一个对象,依次类推,即使这个函数被父级对象的父级对象........所包裹);在调用的时候,尽管这个函数是被最外层的对象所调用,函数中的this指向的也只是它的父级对象;
二:当碰到的this在构造函数里面时的情况:
function Fn(){
this.name="瞎搞"
};
var user=new Fn();
console.log(user.name); //瞎搞
这里之所以能够通过实例化的对象来调用name属性,这是因为new 关键字改变了this的指向;此时的this指向的是实例化出来的user对象;
三:当有this的函数中有return 关键词的时;
function Fn(){
this.name="瞎搞";
return {name:"瞎说"}
};
var obj=new Fn();
console.log(obj.name); //瞎说;
function Fn(){
this.name="瞎搞";
return {}
};
var obj=new Fn();
console.log(obj.name); //undefined;
function Fn(){
this.name="瞎搞";
return 1;
};
var obj=new Fn();
console.log(obj.name); //瞎搞;
function Fn(){
this.name="瞎搞";
return null;
};
var obj=new Fn();
console.log(obj.name); //瞎搞;
在上述三个例子中,不知道各位有没有看出来什么;
从上述例子中,我们可以明显的知道,在一个有this的函数中,如果有return 关键字,且返回的是一个对象,那么this指向的就是返回的那个对象,也行有人会说最后一个例子中,返回的是一个null,在js里面,null也是对象,那为什么最后调用name属性的时候,也会输出“瞎搞”,这里麻烦大家记住,对于返回值为null的,this也是指向通过函数实例化的那个对象;
而如果返回的不是一个对象,而是一个非引用类型的,this指向的也是通过函数实例化出来的对象; ,即.return的是五种简单数据类型:String, Number,Boolean,Null,Undefined,这种情况下,忽视return值,依然返回this对象。
如有错误的地方,欢迎各位指正
相关推荐
这时,this指向的是最后调用它的对象,在foo.fn()语句中,this指向的是foo对象。 例题 4: ``` const student = { name: 'zhangsan', fn: function () { return this; } } console.log(student.fn() === ...
### JavaScript中this指向详解 #### 一、引言 在JavaScript编程中,`this`关键字的使用及其指向问题一直是困扰很多开发者的难点之一。不同于传统面向对象编程语言如Java或C#中的`this`概念,JavaScript中的`this`...
复习JavaScript中this指向及绑定
由于this在JavaScript中的运行期绑定特性,导致了this指向的复杂性。 在JavaScript中,this的指向可以有以下几种情况: 1. 指向window的隐式指向 在全局作用域中,如果函数没有明确的调用者,那么this通常指向全局...
为了让读者更加深入地理解JavaScript中的this指向问题,本文将会详细分析this在不同场景下的行为,并通过实际代码示例来说明。 首先,JavaScript中的this不同于一些其他面向对象编程语言(如Java或C#)中的this。在...
文章中写的东西导出在一个Markdown文件中,想要的志同道合的朋友,童鞋可以下载浏览。欢迎有错误指出 谢谢!
情况3:假如一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象。 这篇文章深入探讨了JavaScript中的this指针指向问题,并提供了多个例子来说明this...
JavaScript中this的指向还没搞明白?来这看看 你就懂啦~
- 在全局环境中,`this`默认指向`window`对象(在浏览器环境下),或者在Node.js中,`this`指向全局对象`global`。在下面的代码示例中,`this`可以用来访问全局变量: ```javascript var str = "hello JavaScript...
全局作用域、普通函数以及定时器中的this指向全局对象window 方法中的this指向的是调用它的对象 构造函数中的this指向构造函数的实例 箭头函数中没有绑定this,this为最近外层作用域下有定义的this call、apply、...
在浏览器环境中,`this`通常指向全局对象`window`(在Node.js中则指向`global`对象)。 示例代码: ```javascript function fn() { console.log(this); // 输出:window } ``` ##### 2. 在构造函数中 当函数作为...
在JavaScript编程中,`this`关键字是一个至关重要的概念,它表示...了解这些基本规则后,处理JavaScript中的`this`指向问题将变得更加容易。在编写代码时,正确理解和使用`this`是避免错误和提高代码可读性的重要步骤。
js中的this指向的几种具体情况: 1.通过函数名直接调用,this指向window; 2.函数作为window内置函数的回调函数调用,this指向window; 3.通过对象调用函数,this指向这个对象; 4.函数作为构造函数,this指向新new...
JavaScript中的this指向.md
1. **默认指向**:在一个非严格模式的全局环境中,如果`this`未被任何对象引用,它将默认指向`window`对象(在浏览器环境)或`global`对象(在Node.js环境)。在严格模式下,`this`在全局作用域中将被设置为`...
- 在全局作用域中,`this` 指向全局对象,在浏览器环境中是 `window`,在 Node.js 中是 `global`。 - 在函数调用中,如果函数不是一个方法(即没有被某个对象拥有),`this` 也会指向全局对象。 2. **隐式绑定**...
深度理解js中this的指向问题
在JavaScript中,当函数作为对象的一个方法被调用时,`this`会指向调用该方法的对象。例如: ```javascript var obj = { str: "wangwu", say: function() { alert(this.str); } }; obj.say(); // 输出 "wangwu...
JavaScript中的`this`指向问题是一个常见且重要的概念,对于理解和编写高效、无错误的JavaScript代码至关重要。`this`关键字在JavaScript中表示当前上下文的对象,它的指向不是固定的,而是根据函数调用方式的不同而...