`

JavaScript Garden - this 的工作原理

阅读更多

this 的工作原理

JavaScript 有一套完全不同于其它语言的对 this 的处理机制。
种不同的情况下 ,this 指向的各不相同。

全局范围内

this;

当在全部范围内使用 this,它将会指向全局对象。

译者注浏览器中运行的 JavaScript 脚本,这个全局对象是 window

函数调用

foo();

这里 this 也会指向全局对象。

ES5 注意: 在严格模式下(strict mode),不存在全局变量。
这种情况下 this 将会是 undefined

方法调用

test.foo(); 

这个例子中,this 指向 test 对象。

调用构造函数

new foo(); 

如果函数倾向于和 new 关键词一块使用,则我们称这个函数是 构造函数
在函数内部,this 指向新创建的对象。

显式的设置 this

function foo(a, b, c) {}

var bar = {};
foo.apply(bar, [1, 2, 3]); // 数组将会被扩展,如下所示
foo.call(bar, 1, 2, 3); // 传递到foo的参数是:a = 1, b = 2, c = 3

当使用 Function.prototype 上的 call 或者 apply 方法时,函数内的 this 将会被
显式设置为函数调用的第一个参数。

因此函数调用的规则在上例中已经不适用了,在foo 函数内 this 被设置成了 bar

注意: 在对象的字面声明语法中,this 不能用来指向对象本身。
因此 var obj = {me: this} 中的 me 不会指向 obj,因为 this 只可能出现在上述的五种情况中。
译者注这个例子中,如果是在浏览器中运行,obj.me 等于 window 对象。

常见误解

尽管大部分的情况都说的过去,不过第一个规则(译者注这里指的应该是第二个规则,也就是直接调用函数时,this 指向全局对象)
被认为是JavaScript语言另一个错误设计的地方,因为它从来就没有实际的用途。

Foo.method = function() {
    function test() {
        // this 将会被设置为全局对象(译者注:浏览器环境中也就是 window 对象)
    }
    test();
}

一个常见的误解是 test 中的 this 将会指向 Foo 对象,实际上不是这样子的。

为了在 test 中获取对 Foo 对象的引用,我们需要在 method 函数内部创建一个局部变量指向Foo 对象。

Foo.method = function() {
    var that = this;
    function test() {
        // 使用 that 来指向 Foo 对象
    }
    test();
}

that 只是我们随意起的名字,不过这个名字被广泛的用来指向外部的 this 对象。
在 闭包 一节,我们可以看到 that 可以作为参数传递。

方法的赋值表达式

另一个看起来奇怪的地方是函数别名,也就是将一个方法赋值给一个变量。

var test = someObject.methodTest;
test();

上例中,test 就像一个普通的函数被调用;因此,函数内的 this 将不再被指向到someObject 对象。

虽然 this 的晚绑定特性似乎并不友好,但是这确实基于原型继承赖以生存的土壤。

function Foo() {}
Foo.prototype.method = function() {};

function Bar() {}
Bar.prototype = Foo.prototype;

new Bar().method();

当 method 被调用时,this 将会指向 Bar 的实例对象。

分享到:
评论

相关推荐

    Presentations-JavaScriptThis-源码.rar

    JavaScript中的`this`关键字是编程过程中经常会遇到的一个重要概念,尤其在函数调用、对象方法、构造函数以及事件处理等场景下,理解`this`的工作原理对于深入掌握JavaScript至关重要。`Presentations-JavaScript...

    JavaScript教程--从入门到精通(PPT精简版)

    JavaScript教程--从入门到精通(PPT精简版).ppt

    cookie-garden-helper:在游戏中使您的花园自动化Cookie Clicker

    LoadMod ( 'https://rawgit.com/yannprada/cookie-garden-helper/master/cookie-garden-helper.js' ) ; } ( ) ) ; 这个怎么运作 首先,点击花园/农场底部的“ Cookie Garden Helper ”按钮。 在这里,您可以配置您...

    day13-javascript调试原理.md

    day13-javascript调试原理.md

    org.mozilla.javascript-1.7.2.jar

    本文将围绕"org.mozilla.javascript-1.7.2.jar"这个资源包,详细讲解其功能、原理以及在实际开发中的应用。 首先,"org.mozilla.javascript-1.7.2.jar"是Mozilla的Rhino JavaScript引擎的一个版本。Rhino是一个开源...

    JavaScript_Garden_CN

    2. **函数**: 包括函数声明与表达式、`this`的工作原理、闭包与引用、`arguments`对象、构造函数、作用域与命名空间等内容,深入探讨了函数的灵活性和复杂性。 3. **数组**: 阐述了数组的遍历与属性、`Array`构造...

    测试驱动JavaScript开发-Test Driven JavaScript Development-PDF-英文版

    目前仅有的讲JavaScript的测试驱动开发的书,英文版,Amazon书评4星级的好书。

    JavaScript Domain-Driven Design(PACKT,2015)

    You'll follow this up with how to set up your projects and utilize the TDD tools. Different objects and prototypes will help you create model for your business process and see how DDD develops common...

    廖雪峰-JavaScript教程-PDF版

    ### 廖雪峰-JavaScript教程-PDF版 #### JavaScript的重要性及发展历程 JavaScript作为世界上最流行的脚本语言之一,在Web开发领域占据着举足轻重的地位。无论是个人开发者还是大型企业,都离不开JavaScript的支持...

    基于HTML、JavaScript、CSS的Garden-App智慧园林设计源码

    该项目是一款基于HTML、JavaScript和CSS开发的智慧园林设计应用程序源码,包含332个文件,其中包括134个HTML文件、115个PNG图片文件、39个JavaScript文件、18个CSS文件、5个XML文件、4个DS_Store文件、4个JPG文件、3...

    Javascript Garden 网页的静态文件

    10. **性能优化**:了解V8引擎的工作原理,以及如何通过优化代码结构、减少DOM操作、利用缓存等手段提升JavaScript的执行效率。 以上只是JavaScript Garden中部分重要知识点的概述,实际的学习过程中,还会涉及更多...

    JavaScript工作原理及对象详解.docx

    JavaScript是一种广泛应用于Web开发的动态编程语言,它的工作原理基于弱数据类型,允许开发者创建复杂的对象来存储和处理数据。本文将深入探讨JavaScript的工作原理以及对象的详细概念。 首先,JavaScript中有两种...

    Single Page Web Applications JavaScript end-to-end

    This book assumes basic knowledge of web development. No experience with SPAs is required. What’s Inside Design, build, and test a full-stack SPA Best-in-class tools like jQuery, TaffyDB, Node.js, ...

    Javascript教程--从入门到精通【完整版】.pdf

    - 基本的JavaScript语句可以通过`alert()`函数展示弹窗消息,例如`alert("This is JavaScript");`。 - JavaScript中可以使用HTML注释`<!-- -->`来隐藏或注释掉某段代码,如`<!--//-->`。 - JavaScript区分大小写...

    Javascript教程--从入门到精通【完整版】

    ### JavaScript教程——从入门到精通 #### 一、JavaScript概览及重要性 在互联网时代,随着技术的不断...无论是初学者还是有经验的开发者,都应该深入学习和掌握JavaScript,以便在未来的工作中更好地应对各种挑战。

    javascript中onclick(this)用法介绍

    本文将详细介绍JavaScript中一种常见的事件处理用法——onclick(this)。 首先,我们需要理解什么是onclick事件处理器。在HTML中,onclick是一个事件属性,用于指定当元素被点击时将调用的JavaScript代码。这个属性...

    Javascript Obfuscator代码混淆

    JavaScript Obfuscator的工作原理主要包括以下几个步骤: 1. 变量和函数重命名:将有意义的变量和函数名称替换为无意义的短字符串,例如`function add(a, b) { return a + b; }`可能会被混淆为`function a(b, c) { ...

    Photoshop-CS6-JavaScript.zip

    通过深入阅读"Photoshop-CS6-JavaScript-Ref.pdf"和"Photoshop-CS6-Scripting-Guide.pdf"这两份文档,你将能够掌握Photoshop CS6的JavaScript编程技术,并利用这些知识提升你的图像处理效率和创新能力。无论你是专业...

    javascript-高性能javascript模版引擎-templateEngine.zip

    在“javascript-高性能javascript模版引擎-templateEngine.zip”这个压缩包中,我们很显然会发现一个关于创建高效JavaScript模板引擎的资源集合。下面我们将详细探讨JavaScript模板引擎的工作原理、优点、常见实现...

Global site tag (gtag.js) - Google Analytics