Javascript中this的指向一直是困扰我很久的问题,在使用中出错的机率也非常大。在面向对象语言中,它代表了当前对象的一个引用,而在js中却经常让我觉得混乱,它不是固定不变的,而是随着它的执行环境的改变而改变。
在Javascript中this总是指向调用它所在方法的对象。因为this是在函数运行时,自动生成的一个内部对象,只能在函数内部使用。
下面我们分几种情况深入分析this的用法:
1.全局的函数调用
function globalTest() {
this.name = "global this";
console.log(this.name);
}
globalTest(); //global this
以上代码中,globalTest()是全局性的方法,属于全局性调用,因此this就代表全局对象window。为了充分证明this是window,对代码做如下更改:
var name = "global this";
function globalTest() {
console.log(this.name);
}
globalTest(); //global this
name作为一个全局变量,运行结果仍然是“global this”,说明this指向的是window。在方法体中我们尝试更改全局name,再次调用方法输出“rename global this”, 说明全局的name在方法内部被更改。代码如下:
var name = "global this";
function globalTest() {
this.name = "rename global this"
console.log(this.name);
}
globalTest(); //rename global this
根据以上三段代码,我们得出结论:对于全局的方法调用,this指向的是全局对象window,即调用方法所在的对象。
2.对象方法的调用
如果函数作为对象的方法调用,this指向的是这个上级对象,即调用方法的对象。 在以下代码中,this指向的是obj对象。
function showName() {
console.log(this.name);
}
var obj = {};
obj.name = "ooo";
obj.show = showName;
obj.show(); //ooo
3.构造函数的调用
构造函数中的this指向新创建的对象本身。
function showName() {
this.name = "showName function";
}
var obj = new showName();
console.log(obj.name); //showName function
上述代码中,我们通过new关键字创建一个对象的实例,new关键字可以改变this的指向,将这个this指向对象obj。
我们再增加一个全局的name,用以证明this指向的不是global:
var name = "global name";
function showName() {
this.name = "showName function";
}
var obj = new showName();
console.log(obj.name); //showName function
console.log(name); //global name
在构造函数的内部,我们对this.name进行赋值,但并没有改变全局变量name。
4.apply/call调用时的this
apply和call都是为了改变函数体内部的this指向。 其具体的定义如下:
call方法:
语法:call(thisObj,Object)
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
apply方法:
语法:apply(thisObj,[argArray])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
var value = "Global value";
function FunA() {
this.value = "AAA";
}
function FunB() {
console.log(this.value);
}
FunB(); //Global value 因为是在全局中调用的FunB(),this.value指向全局的value
FunB.call(window); //Global value,this指向window对象,因此this.value指向全局的value
FunB.call(new FunA()); //AAA, this指向参数new FunA(),即FunA对象
FunB.apply(window); //Global value
FunB.apply(new FunA()); //AAA
在上述代码中,this的指向在call和apply中是一致的,只不过是调用参数的形式不一样。call是一个一个调用参数,而apply是调用一个数组。具体的会在以后的博文中单独阐述。
相关推荐
在全局作用域中,`this`指向全局对象。在浏览器环境中,全局对象是`window`;在Node.js中,全局对象是`global`。 ```javascript console.log(this === window); // 浏览器环境下为 true console.log(this === ...
在JavaScript中,`this`关键字的作用域和指向是理解JavaScript面向对象编程的关键概念之一。`this`的值并不像其他一些编程语言中的对象引用那样固定,而是根据其执行上下文动态确定。下面是针对不同场景下`this`的...
JavaScript中的`this`具有动态作用域,这意味着`this`的值是在运行时确定的,具体取决于函数的调用上下文。当函数作为对象的方法被调用时,`this`将引用包含该方法的对象;当函数独立调用(即不作为任何对象的方法)...
### JavaScript执行环境及作用域详解 #### 执行环境概述 执行环境定义了变量或函数能够访问的数据以及其他相关信息,它决定了这些变量和函数的行为方式。在JavaScript中,执行环境的概念至关重要,因为它不仅涉及...
如果函数不在任何作用域中(如全局环境下的`<script>`标签或者Node.js模块),`this`将指向全局对象。 在严格模式下,如果`this`尝试指向`undefined`或`null`,它将保持`undefined`,而不是自动转换为全局对象。...
在全局作用域中,`this`通常指向全局对象,即浏览器环境中的`window`对象。在上述示例中,`sayHi`函数内的`this.name`实际上等同于`window.name`。当直接调用`sayHi()`时,`this`被设置为全局对象。 2. **对象方法...
- **异步回调**:在回调函数或Promise链中,`this`取决于外部作用域或如何调用。 理解`this`的关键在于识别调用上下文和调用模式。在编写JavaScript代码时,对`this`的理解有助于避免常见的错误和陷阱。通过深入...
## JavaScript 中的 `this` 对象详解 JavaScript 是一种基于对象和事件驱动的动态类型语言,它允许开发者使用面向对象的编程范式。在这个过程中,`this` 关键字扮演了至关重要的角色。然而,`this` 在 JavaScript ...
JavaScript作用域和作用域链是JS编程中非常核心的概念,理解这些概念对于编写可预测和高效的代码至关重要。首先,让我们来探讨JavaScript中的作用域。 一、JavaScript作用域 在JavaScript中,作用域决定了变量和...
1. **全局上下文中的this**:在全局作用域中,`this`通常指向全局对象,即浏览器环境中的`window`对象。在上面的示例中,当`sayHi`作为一个全局函数调用时,`this`就是`window`,因此`this.name`等同于`window.name`...
1. **普通函数**:在全局作用域或非严格模式下,普通函数调用时,`this`通常指向全局对象,在浏览器环境中就是`window`对象。例如: ```javascript function fn() { console.log('this:', this); } fn(); // 输出:...
### JavaScript 中 `this` 的用法详解 #### 一、引言 在 JavaScript 开发过程中,`this` 关键字的使用常常令开发者感到困惑。这是因为 `this` 的值并不是静态确定的,而是取决于函数调用的方式。了解 `this` 的...
在第一个例子中,我们有一个全局变量`name`和一个名为`sayHi`的函数,当调用`sayHi`时,`this.name`实际上指的是全局的`name`变量,因为`sayHi`在全局作用域中被调用,所以`this`指向全局对象`window`。 在第二个...
在全局作用域中,`this`通常指向全局对象,对于浏览器环境而言,全局对象就是`window`。例如: ```javascript var globalVar = "Global Value"; function globalFunction() { console.log(this.globalVar); } ...
在这个例子中,`this`指向全局对象,所以`this.x = 1`实际上是在全局作用域中设置了一个变量`x`。 2. **作为对象方法的调用** 当函数被用作对象的一个方法时,`this`将指向该对象。例如: ```javascript ...
当函数在全局作用域中被调用时,`this`通常引用的是全局对象,在浏览器环境中就是`window`对象。例如: ```javascript function fn1() { console.log(this); // 输出全局对象,通常是window } fn1(); ``` 2....
在JavaScript全局作用域中,this关键字默认指向全局对象。在浏览器环境中,这个全局对象是window。例如: ```javascript alert(this); // 在浏览器中弹出[object Window] ``` 如果在全局作用域下声明变量和函数,则...
JavaScript中的`this`绑定是一个关键概念,涉及到函数调用、对象方法、构造函数...熟悉这些概念后,可以进一步探索JavaScript中的闭包(如何保留外部作用域的引用)和继承(如原型链、类继承、组合继承等)等高级话题。
### JavaScript中this指向详解 #### 一、引言 在JavaScript编程中,`this`关键字的使用及其指向问题一直是困扰很多开发者的难点之一。不同于传统面向对象编程语言如Java或C#中的`this`概念,JavaScript中的`this`...