语法
this
全局对象
在全局执行上下文(函数之外),this引用的是全局对象.
console.log(this.document === document); // true
// In web browsers, the window object is also the global object:
console.log(this === window); // true
this.a = 37;
console.log(window.a); // 37
函数
在函数里面,this这个值,得看怎么来调用这个函数
简单的调用
function f1(){
return this;
}
f1() === window; // global object
在这个例子中,this不是没有被赋予任何值.没有申明为严格模式下,this必须要有一个值去赋予.默认情况下就是指向的是全局对象.
function f2(){
"use strict"; // see strict mode
return this;
}
f2() === undefined;
严格模式下, this没有被申明,则为undefined.他也可以是任何值,比如null或者42或者其他.
作为一个对象的方法
当一个函数作为一个对象的方法去调用,this指向的是对象本身.
下面的例子中,当 o.f()被调用,函数里面的this指向的是 o对象.
var o = {
prop: 37,
f: function() {
return this.prop;
}
};
console.log(o.f()); // logs 37
假如 o 对象只申明了一个属性,其f方法在开始声明时还没有被定义,然后通过o.f直接被赋值为其他方法,其最后的效果也是一样的,只是定义的前后问题,this依然指向的是o这个对象:
var o = {prop: 37};
function independent() {
return this.prop;
}
o.f = independent;
console.log(o.f()); // logs 37
这个例子说明的是f函数的调用,是作为o的成员方法来执行.
我们继续来看,如果我们给o设定另外一个成员属性b赋予为一个对象,看下面这个例子,这时候,this该指向的是谁呢? 前面已经说过,this指向的是对象本身,所以o.b作为一个对象,同样这个对象的this指向的是他自己o.b.
o.b = {g: independent, prop: 42};
console.log(o.b.g()); // logs 42
对象原型链中的this
同样的概念也使用对象原型链中
var o = {f:function(){ return this.a + this.b; }};
var p = Object.create(o);
p.a = 1;
p.b = 4;
console.log(p.f()); // 5
在这个例子中,对象p没有自己的属性.它继承了o的属性.所以这时候通过p来调用f方法,this指向的是p,这是对象原型模式.这里就是javascript中的原型继承模式.
this与getter和setter
再次,用相同的概念也适用于getter和setter.函数使用getter或者setter来绑定到对象的属性.
function modulus(){
return Math.sqrt(this.re * this.re + this.im * this.im);
}
var o = {
re: 1,
im: -1,
get phase(){
return Math.atan2(this.im, this.re);
}
};
Object.defineProperty(o, 'modulus', {
get: modulus, enumerable:true, configurable:true});
console.log(o.phase, o.modulus); // logs -0.78 1.4142
作为一个构造函数
.当一个函数作为一个构造函数使用(同构new来构造).this这时候指向的是函数构造出来的对象.
提示: 虽然默认构造函数返回对象引用,它也可以返回其他对象 .
/*
* Constructors work like this:
*
* function MyConstructor(){
* // Actual function body code goes here.
* // Create properties on |this| as
* // desired by assigning to them. E.g.,
* this.fum = "nom";
* // et cetera...
*
* // If the function has a return statement that
* // returns an object, that object will be the
* // result of the |new| expression. Otherwise,
* // the result of the expression is the object
* // currently bound to |this|
* // (i.e., the common case most usually seen).
* }
*/
function C(){
this.a = 37;
}
var o = new C();
console.log(o.a); // logs 37
function C2(){
this.a = 37;
return {a:38};
}
o = new C2();
console.log(o.a); // logs 38
在最后的例子中(C2),因为一个对象在构造函数期间返回,这个新对象就会被丢弃.("this.a=37"; 其实没什么作用的代码.但是他也不是完全是死码,因为他被执行了.但是没有影响到外面的代码执行.)
call
和apply
一个函数在内部使用this,通过使用call或者apply方法将它的值绑定到一个特殊的对象.所有方法继承Function.prototype.
function add(c, d){
return this.a + this.b + c + d;
}
var o = {a:1, b:3};
// The first parameter is the object to use as
// 'this', subsequent parameters are passed as
// arguments in the function call
add.call(o, 5, 7); // 1 + 3 + 5 + 7 = 16
// The first parameter is the object to use as
// 'this', the second is an array whose
// members are used as the arguments in the function call
add.apply(o, [10, 20]); // 1 + 3 + 10 + 20 = 34
我们来看下下面的这个列子.bar.call(7)这一行代码,将第一个参数为一个数值,则这时候的bar方法里面的this是指向Number.到这里,你可以试试执行另外的一行代码 new Number(10).toString(),看看效果.
function bar() {
console.log(Object.prototype.toString.call(this));
}
bar.call(7); // [object Number]
bind方法
ECMAScript 5 介绍了Function.prototype.bind
.bind是创建了一个新函数而不是修改一个函数.新函数的行为和原来函数的行为一样,但他的接收者是我们给定的对象,而原有函数的接收者保持不变.
function f(){
return this.a;
}
var g = f.bind({a:"azerty"});
console.log(g()); // azerty
var o = {a:37, f:f, g:g};
console.log(o.f(), o.g()); // 37, azerty
作为DOM事件处理
当一个函数用在事件处理上.他的this将是指向这个元素的本身事件(使用addEventListener添加监听器事件中,有些浏览器不遵守公约,有自己的一套做法.)
// When called as a listener, turns the related element blue
function bluify(e){
// Always true
console.log(this === e.currentTarget);
// true when currentTarget and target are the same object
console.log(this === e.target);
this.style.backgroundColor = '#A5D9F3';
}
// Get a list of every element in the document
var elements = document.getElementsByTagName('*');
// Add bluify as a click listener so when the
// element is clicked on, it turns blue
for(var i=0 ; i<elements.length ; i++){
elements[i].addEventListener('click', bluify, false);
}
内联事件处理
当代码在元素上进行调用处理,this指向的是这个DOM元素.
<button onclick="alert(this.tagName.toLowerCase());">
Show this
</button>
上面显示的是这个按钮. 记住只有这种方式,返回的是这个元素.
<button onclick="alert((function(){return this}()));">
Show inner this
</button>
在这个例子中,内部函数this没有被设置,因此它返回的全局对象window.
本文属于吴统威的博客,微信公众号:bianchengderen的原创文章,转载时请注明出处及相应链接:http://www.wutongwei.com/front/infor_showone.tweb?id=156
,欢迎大家传播与分享.
分享到:
相关推荐
### 详解Javascript中的`this`指针 在深入探讨`this`指针之前,我们首先应当明确`this`在JavaScript中的基本概念与作用。`this`关键字在JavaScript中扮演了一个非常核心的角色,它是一个特殊的变量,用于引用调用...
在JavaScript编程语言中,`this`关键字是一个至关重要的概念,它常常引发初学者的困惑,因为它的值在不同的上下文中可能会有所不同。`this`关键字主要用来引用对象的上下文,或者说是当前执行环境中的对象。在本文中...
在JavaScript中,`this`关键字是一个至关重要的概念,它在不同上下文中有着不同的指向。`this`在JavaScript中并不像其他静态类型语言(如Java或C++)中的指针那样工作,而是根据函数调用的方式动态确定其值。以下是...
JavaScript中的`this`关键字是一个非常重要的概念,它用于在函数执行时引用当前上下文的对象。在JavaScript中,`this`的绑定遵循四个主要规则:默认绑定、隐式绑定、显式绑定和new绑定。让我们逐一深入理解这些规则...
## JavaScript 中的 `this` 对象详解 JavaScript 是一种基于对象和事件驱动的动态类型语言,它允许开发者使用面向对象的编程范式。在这个过程中,`this` 关键字扮演了至关重要的角色。然而,`this` 在 JavaScript ...
在JavaScript中,`this`关键字是一个非常重要的概念,它用于引用当前上下文中的对象。由于JavaScript是一种基于原型的动态类型语言,`this`的值在不同的执行环境中可能会有所不同,这使得理解和使用`this`成为了一个...
在JavaScript中,`this`对象是一个至关重要的概念,它在不同上下文中扮演着不同的角色,帮助开发者实现面向对象的编程。`this`的值取决于函数调用的方式,而不是函数的定义位置。以下是对`this`对象的详细解释: 1....
JavaScript中的`this`指向问题是一个常见且重要的概念,对于理解和编写高效、无错误的JavaScript代码至关重要。`this`关键字在JavaScript中表示当前上下文的对象,它的指向不是固定的,而是根据函数调用方式的不同而...
JavaScript 中的this 总是让人迷惑,应该是js 众所周知的坑之一。 个人也觉得js 中的this 不是一个好的设计,由于this 晚绑定的特性,它可以是全局对象, 当前对象,或者…有人甚至因为坑大而不用this。 其实如果...
在JavaScript中,`this`关键字是一个至关重要的概念,它用于引用函数或方法执行时的上下文对象。`this`的值取决于函数调用的方式,而不是函数定义的位置。在JavaScript中,`this`的四种主要绑定方式包括:默认绑定、...
在JavaScript中,`this`关键字是一个非常关键的概念,它用于在函数或方法中引用当前上下文的对象。在不同的情境下,`this`的值可能会有所变化,这使得理解和掌握`this`的工作原理变得至关重要。 首先,让我们回顾...
在JavaScript中,`this`关键字是一个非常重要的概念,它指的是当前执行上下文中的对象。`this`的值取决于函数的调用方式,而不是定义方式。下面我们将详细探讨在不同场景下`this`的用法。 1. **全局作用域中调用...
### JavaScript中的函数分类与this指向详解 #### 一、引言 在JavaScript中,函数是一种非常重要的编程单元,它不仅可以封装一系列的操作逻辑,还可以作为数据进行传递和处理。此外,函数内部的关键字`this`的指向...
JavaScript中的`this`关键字是一个非常重要的概念,它在不同的上下文中具有不同的指向。理解`this`的指向对于编写高效和可维护的JavaScript代码至关重要。在本文中,我们将深入探讨`this`在各种函数调用场景下的行为...
在JavaScript中,`this`对象是根据函数调用的方式动态确定的,它指向调用该函数的那个对象。在上面的例子中,我们创建了一个名为`Person`的构造函数,它接受一个参数`name`并将其绑定到`this`对象的`name`属性。`...
### JavaScript 中 `this` 的用法详解 #### 一、引言 在 JavaScript 开发过程中,`this` 关键字的使用常常令开发者感到困惑。这是因为 `this` 的值并不是静态确定的,而是取决于函数调用的方式。了解 `this` 的...
JavaScript中的`this`绑定是一个关键概念,涉及到函数调用、对象方法、构造函数等多个场景。`this`在JavaScript中并不像其他语言中的`this`那样简单地指向对象本身,而是根据函数调用的方式动态确定其指向。理解`...
JavaScript是一种广泛应用于网页和网络应用的编程语言,它在网页开发中扮演着至关重要的角色,主要负责实现动态交互效果和处理用户输入。本教程旨在帮助初学者深入理解JavaScript的基础概念和核心特性,以便快速入门...
### JavaScript中的`this`用法详解 在JavaScript中,`this`关键字的使用十分常见,但也是最容易引起混淆的部分之一。正确理解`this`的工作原理对于编写高效、可靠的代码至关重要。本文将深入探讨`this`在不同上下...