`

javascript之function的this

阅读更多
javascript之function的this

一、this 的定义 与 函数的调用

在 javascript 中, function 中的 this 指代的是: 调用 function 执行时的上下文。
也就是说,调用哪个对象的 function,this就指代哪个对象。默认是 window 对象。

1. this 可以指代一个普通对象
var Bucky = {
    pringtFirstName: function(){
        console.log("My name is Bucky.");
        console.log( this === Bucky );   // true
    }
}
Bucky.pringtFirstName();


2. this 可以指代 默认的 window 对象
function doSomethingWorthless(){
    console.log("I am worthless.");
    console.log( this === window );      // true
}
doSomethingWorthless();                  // window.doSomethingWorthless(); 



3. this 可以指代 function 对象的 prototype 对象

var foo = function(){};
foo.prototype.sayHello = function(){
    this.name = "Hello,World!"; 
}
foo.prototype.sayHello();

console.log(foo.prototype.name);     // "Hello,World!"



4. this 可以指代 function 对象的 一个实例

foo = function(){} 
foo.prototype.sayHello = function(){
    this.name = "Hello World !";
} 

var f = new foo();
f.sayHello();

console.log(f.name);     // "Hello World !";



可以看出:
     1) 调用哪个对象的 function , this 就指代哪个对象。
     2) 所调用的对象,即:function运行时的上下文。
     3) this 与 怎样调用 function 有关。



二、函数运行时,this 的引用

1. this 可以在 function 的 prototype 对象中被引用

foo = function(){   
    this.name = "Foo function.";   
}   

foo.prototype.sayHello = function(){  
    console.log( this.name );     //"Foo function."   
}   

var f = new foo();   
f.sayHello();                     // sayHello() 运行的上下文环境是 f 对象






三、function 中与 this 相关的两个函数: apply(), call()

前面说了,既然 this 是与调用 function 的对象有关。
那么,当调用对象的 function 时,是否可以指定一个运行时的上下文 this 对象?



1、理解 function 的 apply() 方法。

The apply() method calls a function with a given this value and arguments provided as an array.

   apply 什么呢? 把当前的对象(只要类型是 object 即可) apply 给 function,作为该 function 的 this 对象。
   apply 方法针对的是将要执行的 function 的 this。 它可以在调用函数时,指定一个它的 this 对象。
   即:在已经有预设定值的对象上,继续进行this的创建。

1) this 指向执行函数的对象 - 将 function 作为参数

foo = function(){   
    this.name = "Foo function.";   
}   

foo.prototype.sayHello = function(){  
    var me = this;             // this 在这里是 window 对象。

    console.log(me.name);      // null
    console.log(this.f.name);  //"Foo function."
}   

var f = new foo();   
setTimeout(f.sayHello, 1000);   // 运行的是 window.setTimeout()



2) this 指向执行函数的对象 - 直接执行函数

foo = function(){   
    this.name = "Foo function.";   
}   

foo.prototype.sayHello = function(){  
    var me = this;             // this 在这里是 f 对象。

    console.log(me.name);      // "Foo function."
    console.log(this.f.name);  // 报错:f 未定义
}   

var f = new foo();   
f.sayHello();                  // 运行的是 f 



3) this 指向执行函数的对象 - 指定一个 this 执行

foo = function(){   
    this.name = "Foo function.";   
}   

foo.prototype.sayHello = function(){  
    var me = this;             // this 在这里是 window 对象。

    console.log(me.name);      // null
    console.log(this.f.name);  //"Foo function."
}   

var f = new foo();   
f.sayHello.apply(this, window); // 指定 this 为 window 对象





apply() 方法有两个目地:

1. 指定函数执行时的 this 对象;
2. 运行函数。
  (这个目地似乎没有通过从 apply 的方法名称上体现出来,
    或许应该叫: apply_and_run 更能体现出这个方法的作用 )


———————————————————————————————————————————————————————————————————————————


扩展阅读:function 中与 this 相关的另一个函数: bind()


The bind() method creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.

对比 apply() / call():
apply()/ call() 用来调用(执行)函数,而 bind() 用来创建函数。

Syntax
fun.bind(thisArg[, arg1[, arg2[, ...]]])



Parameters

thisArg
The value to be passed as the this parameter to the target function when the bound function is called. The value is ignored if the bound function is constructed using the new operator.

arg1, arg2, ...
Arguments to prepend to arguments provided to the bound function when invoking the target function.




this.x = 9; 
var module = {
  x: 81,
  getX: function() { return this.x; }
};

module.getX(); // 81

var retrieveX = module.getX;
retrieveX();  // returns 9 - The function gets invoked at the global scope


// Create a new function with 'this' bound to module
// New programmers might confuse the
// global var x with module's property x
var boundGetX = retrieveX.bind(module);
boundGetX(); // 81





参考:
Preserving a reference to “this” in JavaScript prototype functions
http://stackoverflow.com/questions/2025789/preserving-a-reference-to-this-in-javascript-prototype-functions





—————————————

javascript 函数基础系列文章

1、JavaScript之变量的作用域
2、javascript之变量类型与变量声明及函数变量的运行机制
3、javaScript之function定义
4、javascript之function的prototype对象
5、javascript之function的(closure)闭包特性
6、javascript之function的this   
7、javascript之function的apply(), call()



___________


javascript 面向对象编程系列文章:

    1、javaScript之面向对象编程
    2、javascript之面向对象编程之属性继承
    3、javascript之面向对象编程之原型继承 
   

-





-
引用请标明
原文出处: http://lixh1986.iteye.com/blog/1960343







-
分享到:
评论

相关推荐

    Javascript中神奇的this

    JavaScript中的`this`关键字是一个非常重要的概念,它与许多其他编程语言中的行为不同,因此常常让开发者感到困惑。本文将详细解析`this`在JavaScript中的工作原理及其绑定规则。 1. `this`并不总是指向函数自身 ...

    深入理解JavaScript中的this关键字

    JavaScript中的`this`关键字是编程过程中经常会遇到的一个关键概念,尤其在面向对象编程中起着至关重要的作用。`this`的值取决于它被调用时的上下文,而不是定义时的位置,这使得它有时会显得有些复杂。在这个深入...

    JavaScript中this关键字使用方法详解

    在JavaScript编程语言中,`this`关键字是一个至关重要的概念,它常常引发初学者的困惑,因为它的值在不同的上下文中可能会有所不同。`this`关键字主要用来引用对象的上下文,或者说是当前执行环境中的对象。在本文中...

    Javascript的this详解

    JavaScript中的`this`关键字是一个非常重要的概念,它用于在函数执行时引用当前上下文的对象。在JavaScript中,`this`的绑定遵循四个主要规则:默认绑定、隐式绑定、显式绑定和new绑定。让我们逐一深入理解这些规则...

    详解Javascript 中的this指针

    ### 详解Javascript中的`this`指针 在深入探讨`this`指针之前,我们首先应当明确`this`在JavaScript中的基本概念与作用。`this`关键字在JavaScript中扮演了一个非常核心的角色,它是一个特殊的变量,用于引用调用...

    JavaScript程序设计-javascript中的this.pdf

    JavaScript中的`this`关键字是一个非常重要的概念,它在不同上下文中具有不同的指向,这使得`this`成为JavaScript灵活但有时也复杂的一部分。`this`的动态绑定特性在编写JavaScript代码时需要特别注意,因为它会影响...

    高手详解javascript中的this指针

    在JavaScript中,`this`关键字是一个至关重要的概念,它在不同上下文中有着不同的指向。`this`在JavaScript中并不像其他静态类型语言(如Java或C++)中的指针那样工作,而是根据函数调用的方式动态确定其值。以下是...

    JavaScript程序设计javascript中this

    JavaScript中的`this`关键字是程序设计中的一个核心概念,它在不同上下文环境中有着不同的指向,这使得理解和掌握`this`的用法至关重要。在JavaScript中,`this`的值取决于函数调用的方式,而不是定义的方式,这为...

    Javascript的this用法

    在JavaScript中,`this`关键字的使用十分常见,但也是最容易引起混淆的部分之一。正确理解`this`的工作原理对于编写高效、可靠的代码至关重要。本文将深入探讨`this`在不同上下文中的行为表现,并通过具体的示例帮助...

    javascript 中关于 this 的用法.zip

    在JavaScript编程语言中,"this"关键字是一个至关重要的概念,它用于引用对象的上下文,尤其是在函数调用时。理解this的用法是提升JavaScript技能的关键。本篇将深入探讨JavaScript中的this用法,帮助你更好地掌握这...

    如何使用Javascript中的this关键字

    在JavaScript中,`this`关键字是一个非常重要的概念,它用于引用函数执行时的上下文对象。`this`的值取决于函数被调用的方式,而不是函数定义的位置。在不同的场景下,`this`的指向会发生变化,这使得它成为...

    JavaScript高级-this绑定规则+箭头函数

    JavaScript中的`this`绑定规则是理解JavaScript面向对象编程的关键概念之一。`this`关键字在不同情况下会有不同的指向,主要取决于函数的调用方式。这里我们将深入探讨四种主要的`this`绑定规则:默认绑定、隐式绑定...

    详细讲解JavaScript中的this绑定

    JavaScript中的`this`绑定是一个关键概念,涉及到函数调用、对象方法、构造函数等多个场景。`this`在JavaScript中并不像其他语言中的`this`那样简单地指向对象本身,而是根据函数调用的方式动态确定其指向。理解`...

    JavaScript中的function使用方法.docx

    JavaScript 中的 function 使用方法 JavaScript 中的 function 使用方法可以分为两种:作为普通逻辑代码容器和作为对象。 一、function 作为普通函数 在 JavaScript 中,function 可以作为普通函数使用,类似于 C...

    javascript运行机制之this详细介绍.docx

    ### JavaScript 运行机制之 `this` 详细介绍 在 JavaScript 中,`this` 是一个非常重要的关键字,它在不同的上下文中会有不同的含义。理解和掌握 `this` 的使用对于编写健壮且优雅的代码至关重要。与 Java、C# 等...

    Javascript 中 this指向

    Javascript 中 this 指向 在Javascript中,this 指向是一个非常重要的概念,它的指向规律影响着函数的执行结果。理解 this 的指向是开发任务的必备技能。 首先,我们需要区分清楚作用域链和this是两套不同的系统,...

    详解javascript中的this对象.docx

    在JavaScript中,`this`对象是一个至关重要的概念,它在不同上下文中扮演着不同的角色,帮助开发者实现面向对象的编程。`this`的值取决于函数调用的方式,而不是函数的定义位置。以下是对`this`对象的详细解释: 1....

    【JavaScript源代码】JavaScript中的this指向问题详解.docx

    JavaScript中的`this`指向问题是一个常见且重要的概念,对于理解和编写高效、无错误的JavaScript代码至关重要。`this`关键字在JavaScript中表示当前上下文的对象,它的指向不是固定的,而是根据函数调用方式的不同而...

    javascript 中 this 的用法.docx

    箭头函数是 ES6 引入的新特性之一,在箭头函数中,`this` 的值不是由函数调用的方式决定的,而是继承自定义箭头函数时所在的作用域: ```javascript var obj = { test: function() { var arrowFunc = () => { ...

    JavaScript中this的使用

    在JavaScript中,`this`可以指向以下四种情况之一: - **全局或函数外部**:在全局作用域中,`this`指向`window`对象(在浏览器环境中)或全局对象(在Node.js中)。 - **对象方法**:当函数作为对象的一个方法被...

Global site tag (gtag.js) - Google Analytics