`

【js】javascript中的this作用域详解【转】

    博客分类:
  • js
阅读更多

 

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是调用一个数组。具体的会在以后的博文中单独阐述。

分享到:
评论

相关推荐

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

    在全局作用域中,`this`指向全局对象。在浏览器环境中,全局对象是`window`;在Node.js中,全局对象是`global`。 ```javascript console.log(this === window); // 浏览器环境下为 true console.log(this === ...

    javascript中的this作用域详解

    在JavaScript中,`this`关键字的作用域和指向是理解JavaScript面向对象编程的关键概念之一。`this`的值并不像其他一些编程语言中的对象引用那样固定,而是根据其执行上下文动态确定。下面是针对不同场景下`this`的...

    详解Javascript 中的this指针

    JavaScript中的`this`具有动态作用域,这意味着`this`的值是在运行时确定的,具体取决于函数的调用上下文。当函数作为对象的方法被调用时,`this`将引用包含该方法的对象;当函数独立调用(即不作为任何对象的方法)...

    javascript执行环境及作用域详解_.docx

    ### JavaScript执行环境及作用域详解 #### 执行环境概述 执行环境定义了变量或函数能够访问的数据以及其他相关信息,它决定了这些变量和函数的行为方式。在JavaScript中,执行环境的概念至关重要,因为它不仅涉及...

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

    如果函数不在任何作用域中(如全局环境下的`<script>`标签或者Node.js模块),`this`将指向全局对象。 在严格模式下,如果`this`尝试指向`undefined`或`null`,它将保持`undefined`,而不是自动转换为全局对象。...

    高手详解javascript中的this指针

    在全局作用域中,`this`通常指向全局对象,即浏览器环境中的`window`对象。在上述示例中,`sayHi`函数内的`this.name`实际上等同于`window.name`。当直接调用`sayHi()`时,`this`被设置为全局对象。 2. **对象方法...

    Javascript的this详解

    - **异步回调**:在回调函数或Promise链中,`this`取决于外部作用域或如何调用。 理解`this`的关键在于识别调用上下文和调用模式。在编写JavaScript代码时,对`this`的理解有助于避免常见的错误和陷阱。通过深入...

    详解javascript中的this对象.pdf

    ## JavaScript 中的 `this` 对象详解 JavaScript 是一种基于对象和事件驱动的动态类型语言,它允许开发者使用面向对象的编程范式。在这个过程中,`this` 关键字扮演了至关重要的角色。然而,`this` 在 JavaScript ...

    javascript 作用于作用域链的详解

    JavaScript作用域和作用域链是JS编程中非常核心的概念,理解这些概念对于编写可预测和高效的代码至关重要。首先,让我们来探讨JavaScript中的作用域。 一、JavaScript作用域 在JavaScript中,作用域决定了变量和...

    详解Javascript 中的this指针.doc

    1. **全局上下文中的this**:在全局作用域中,`this`通常指向全局对象,即浏览器环境中的`window`对象。在上面的示例中,当`sayHi`作为一个全局函数调用时,`this`就是`window`,因此`this.name`等同于`window.name`...

    【JavaScript源代码】JavaScript函数this指向问题详解.docx

    1. **普通函数**:在全局作用域或非严格模式下,普通函数调用时,`this`通常指向全局对象,在浏览器环境中就是`window`对象。例如: ```javascript function fn() { console.log('this:', this); } fn(); // 输出:...

    javascript 中 this 的用法.docx

    ### JavaScript 中 `this` 的用法详解 #### 一、引言 在 JavaScript 开发过程中,`this` 关键字的使用常常令开发者感到困惑。这是因为 `this` 的值并不是静态确定的,而是取决于函数调用的方式。了解 `this` 的...

    高手详解javascript中的this指针.pdf

    在第一个例子中,我们有一个全局变量`name`和一个名为`sayHi`的函数,当调用`sayHi`时,`this.name`实际上指的是全局的`name`变量,因为`sayHi`在全局作用域中被调用,所以`this`指向全局对象`window`。 在第二个...

    详解javascript中的this对象.docx

    在全局作用域中,`this`通常指向全局对象,对于浏览器环境而言,全局对象就是`window`。例如: ```javascript var globalVar = "Global Value"; function globalFunction() { console.log(this.globalVar); } ...

    js中的this关键字详解

    在这个例子中,`this`指向全局对象,所以`this.x = 1`实际上是在全局作用域中设置了一个变量`x`。 2. **作为对象方法的调用** 当函数被用作对象的一个方法时,`this`将指向该对象。例如: ```javascript ...

    详解JavaScript中this关键字的用法_.docx

    当函数在全局作用域中被调用时,`this`通常引用的是全局对象,在浏览器环境中就是`window`对象。例如: ```javascript function fn1() { console.log(this); // 输出全局对象,通常是window } fn1(); ``` 2....

    js中this用法实例详解

    在JavaScript全局作用域中,this关键字默认指向全局对象。在浏览器环境中,这个全局对象是window。例如: ```javascript alert(this); // 在浏览器中弹出[object Window] ``` 如果在全局作用域下声明变量和函数,则...

    详细讲解JavaScript中的this绑定

    JavaScript中的`this`绑定是一个关键概念,涉及到函数调用、对象方法、构造函数...熟悉这些概念后,可以进一步探索JavaScript中的闭包(如何保留外部作用域的引用)和继承(如原型链、类继承、组合继承等)等高级话题。

    JavaScript中this指向.docx

    ### JavaScript中this指向详解 #### 一、引言 在JavaScript编程中,`this`关键字的使用及其指向问题一直是困扰很多开发者的难点之一。不同于传统面向对象编程语言如Java或C#中的`this`概念,JavaScript中的`this`...

Global site tag (gtag.js) - Google Analytics