在此,我假设您已经在运用Javascript中的类概念,假设您还了解OOP中的this.
还是习惯从实例来分析:
var someObject = {};
function someMethod(){
alert((this==window)+','+(this==someObject));
}
someObject.someMethod = someMethod;
someMethod();//true,false
someObject.someMethod();//false,true
上面的代码是定义了一个function和一个对象,并指定对象的某个属性为那个function;
在执行方法时我们知道,可以通过someObject.someMethod()这样调用,也可以通过someMethod()这样直接调用;
归根结底,这两种调用方式都能找到相应内存中的function-someMethod(有名方法),并执行。
但由于this在Javascript中的特殊性,这两种调用方式的输出却截然不同,前者返回false,true,而后者返回true,false,why?
网上有很多描述,我在此以我的理解作一个直白的描述,在需要JS处理机区分this时,方法由谁调用,则this表示谁。(之后会说明不需要JS处理机区分的情况)
someObject.someMethod()调用者为someObject,所以this==someObject返回true;
someMethod ()呢?对window有所理解的人应该知道,Javascript页面级的作用域为window,即缺省有名对象都相当于window的一个属性,如定义var a;相当于指定window.a属性,定义function b同样相当于指定window.b属性。所以someMethod()的调用相当于window.someMethod()调用,调用者为window,所以this==window返回true;
若是只有这样,可能大家还是比较容易理解,在Javascript中还存在两个特殊方法,Function.call和Function.apply。
这两个方法的调用者为someFunction,参数分别为:
call(oCaller,arg1,arg2,...)
apply(oCaller,[arg1,agr2,...])
这两个方法可以显式的告诉JS处理机,执行someFunction中的this对象为我的第一个参数oCaller,这也就是我之前提到的不需要JS处理机区分的情况;
有兴趣的同学可以试运行以下的实例:
var someObject = {};
var someObject2 = {};
function someMethod(){
alert((this==window)+','+(this==someObject)+','+(this==someObject2));
}
someObject.someMethod = someMethod;
someMethod();//true,false,false
someObject.someMethod();//false,true,false
someMethod.apply(someObject);//or call//false,true,false
someMethod.apply(someObject2);//false,false,true
还有一种特殊情况,new操作符处理函数,new操作符会创建一个新对象,将this指向这个新对象,然后进行操作,所以其中的this不表示任何已知句柄的对象,而是一个新的匿名对象,通过赋值语句可以指定给某个变量或者对象属性上,在此不再多作蛰述,试运行以下示例;
var someObject = {};
function ClassA(){
alert((this==window)+','+(this==someObject));
this.someAttr = 'someAttr';
}
someObject = new ClassA();//false,false
alert(someObject.someAttr);//someAttr
分享到:
相关推荐
在JavaScript编程语言中,`this`关键字是一个至关重要的概念,它常常引发初学者的困惑,因为它的值在不同的上下文中可能会有所不同。`this`关键字主要用来引用对象的上下文,或者说是当前执行环境中的对象。在本文中...
JavaScript中this的指向还没搞明白?来这看看 你就懂啦~
js原生态函数中使用jQuery中的$(this)无效的解决方法 在JavaScript开发中,使用jQuery的$(this)在原生态函数中可能会出现无效的问题,本文将对此进行详细的分析和解决方法的介绍。 一、问题描述 在JavaScript开发...
探寻JavaScript中this指针指向 JavaScript中的this指针指向是一个复杂的问题,需要深入了解JavaScript的函数调用机制和对象模型。这篇文章将深入探讨this指针指向的问题,并提供多个例子来说明this指针指向的规律。...
2. **函数没有所属对象(全局环境)**:在非严格模式下,如果函数不在任何对象作用域内被调用,`this` 指向全局对象(在浏览器中是 `window`,在 Node.js 环境中是 `global`)。例如: ```javascript function foo...
JavaScript中的`this`关键字是程序设计中的一个核心概念,它在不同上下文环境中有着不同的指向,这使得理解和掌握`this`的用法至关重要。在JavaScript中,`this`的值取决于函数调用的方式,而不是定义的方式,这为...
复习JavaScript中this指向及绑定
深度理解js中this的指向问题
### JavaScript 中 `this` 的用法详解 #### 一、引言 在 JavaScript 开发过程中,`this` 关键字的使用常常令开发者感到困惑。这是因为 `this` 的值并不是静态确定的,而是取决于函数调用的方式。了解 `this` 的...
- **全局或函数外部**:在全局作用域中,`this`指向`window`对象(在浏览器环境中)或全局对象(在Node.js中)。 - **对象方法**:当函数作为对象的一个方法被调用时,`this`指向调用该方法的对象。 - **构造函数...
js中this相关的测试代码
JavaScript中的`this`关键字是编程过程中经常会遇到的一个关键概念,尤其在面向对象编程中起着至关重要的作用。`this`的值取决于它被调用时的上下文,而不是定义时的位置,这使得它有时会显得有些复杂。在这个深入...
在JavaScript中,`this`关键字是一个非常重要的概念,但同时也是新手开发者经常遇到困惑的地方。`this`的值在不同上下文中会发生变化,这使得理解它的行为变得至关重要。本篇文章将探讨`this`在不同场景下的指向,...
本文实例讲述了js中this用法。分享给大家供大家参考。具体如下: 1. 指向window 全局变量 alert(this) //返回 [object Window] 全局函数 function sayHello(){ alert(this); } sayHello(); 2. ...
这种特性使得this在JavaScript中具有了多重含义,对于初学者来说,确实是一个令人困惑的概念。 首先,需要明确的是,在JavaScript中,this关键字的指向不是在编译期确定的,而是在运行期确定的。这与大多数主流的...
在JavaScript编程中,`this`关键字是一个至关重要的概念,它表示当前上下文中的对象引用。在不同的场景下,`this`的指向会有所不同,这往往让开发者感到困惑。以下是关于`this`指向问题的详细解释: 一、普通函数...
JavaScript中的this关键字是一个非常重要的概念,它在函数执行时确定了函数的执行上下文。在其他编程语言中,函数的调用上下文可能是明确的,但在JavaScript中,this的指向却可能因为多种不同的规则而变化,从而导致...
在JavaScript中,`this`关键字的作用域是一个经常让人困惑的主题,尤其对于那些习惯于其他面向对象语言(如Java或C++)的开发者来说。在这些语言中,`this`通常固定地指向当前对象实例。然而,在JavaScript中,`this...
js中this的指向问题 常见的大概有以下几种情况: 全局作用域、普通函数以及定时器中的this指向全局对象window 方法中的this指向的是调用它的对象 构造函数中的this指向构造函数的实例 箭头函数中没有绑定this,this...