函数中的 this 是在调用时被绑定的,this 指向谁完全取决于函数的调用位置。

确定 this 的绑定对象的方式有 4 种。

默认绑定

默认绑定就是将函数中的 this 绑定给了全局对象 window。这往往适用于我们调用函数时,不带有任何修饰的情况。

function foo() {
console.log(this.a);
} var a = 2; foo(); // 2

我们调用函数 foo 的方式是直接调用,所以函数执行时,函数中的 this 是指向全局对象 window, 取 window 对象的 a 属性,就是取全局变量 a,所以打印出的结果是 2。

隐式绑定

隐式绑定就是将函数作为对象属性调用。这时函数内部的 this 指向对象本身。

function foo() {
console.log(this.a);
} var obj = {
a: 2,
foo: foo
}; obj.foo(); // 2

上面的代码中,我们以 obj 对象的属性形式,调用了 foo 函数,这时函数中的 this 就是对象 objthis.a 就是 obj.a,自然就是 2 了。

还有,对于隐式绑定,函数的调用位置是 对象属性引用链中的最后一层

function foo() {
console.log(this.a);
} var obj2 = {
a: 42,
foo: foo
}; var obj1 = {
a: 2,
obj2: obj2
}; obj1.obj2.foo(); // 42

对象属性引用链中的最后一层是 obj2foo 是它的一个属性,所以 foo 函数执行时,内部 this 指向 obj2 对象,所以打印结果是 42。

显式绑定

显示绑定就是使用函数的 call() 或者 apply() 方法,为执行的函数显式指定上下文执行对象,也就是显式指定执行函数内部的 this 指向的对象。

函数的 call() 或者 apply() 方法接收的第一个参数是一个对象,在调用函数时会将这个对象绑定给 this。就是说是直接给 this 指定绑定的对象,因此称为显式绑定。

function foo() {
console.log(this.a);
} var obj = {
a: 2
}; foo.call(obj); // 2

new 绑定

在传统的面向类的语言中,「构造函数」是类中的一个特殊方法,在使用 new 初始化类实例时会被自动调用。

需要清楚得是:JavaScript 中 new 的机制与面向类的语言中的 new 完全不同

在 JavaScript 中,根本就不存在「构造函数」,只有对函数的「构造调用」。JavaScript 中的所有函数都可以用 new 调用,这种函数调用称为对函数的「构造调用」。

使用 new 来调用函数,或者说在对函数进行「构造调用」时,会自动执行下列步骤:

  1. 创建一个全新的对象。
  2. 新对象执行 [[Prototype]] 连接。
  3. 被调用函数中的 this 绑定到这个新对象。
  4. 如果函数没有返回其他对象,则返回这个新对象。

下面是一个例子:

function foo() {
this.a = a;
} var bar = new foo(2); bar.a; // 2

我们使用 new 来调用 foo() 时,会创建一个全新的对象,然后 foo 函数内部的 this 就会绑定到这个新对象上。

优先级

new 绑定 > 显式绑定 > 隐式绑定 > 默认绑定

YDNJS(上卷):this 的绑定对象的更多相关文章

  1. 背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合

    [源码下载] 背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合 作 ...

  2. 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合

    背水一战 Windows 10 之 绑定 通过 Binding 绑定对象 通过 x:Bind 绑定对象 通过 Binding 绑定集合 通过 x:Bind 绑定集合 示例1.演示如何通过 Bindin ...

  3. 带搜索功能,支持绑定对象到节点的TreeView辅助类

    特点: 1.支持数叶子节点与对象绑定 2.支持xml导入,且数据类相关的xml可自定义,只和泛型的实现有关 3.支持节点搜索功能,可在树结构上要求只显示部分节点 4.用C#编写,但与平台关联性低,可移 ...

  4. Firemonkey绑定对象列表

    在实现Firemonkey绑定对象列表的过程中,我遇到的一些现有教程当中没有提到的细节,分享一下. 1.追加对象 用Navigator插入记录,位置总是在当前记录之前插入,没有在最后追加一个对象的方法 ...

  5. element-ui 使用 Select 组件给 value 属性绑定对象类型

    qq_36437172 2020-06-28 22:38:49  778  收藏 分类专栏: element-ui 文章标签: element-ui Select 组件 value 属性 绑定 对象类 ...

  6. EasyUI 中 DataGrid 控件 列 如何绑定对象中的属性

    EasyUI 中 DataGrid 控件 是我们经常用到的控件之一, 但是 DataGrid 控件 在绑定显示列时却不支持对象属性绑定. 模型如下: public class Manager impl ...

  7. spring mvc各种常见类型参数绑定方式以及json字符串绑定对象

    在使用spring mvc作为框架的时候,为了规范,我们通常希望客户端的请求参数符合规范直接通过DTO的方式从客户端提交到服务端,以便保持规范的一致性,除了很简单的情况使用RequestParam映射 ...

  8. spring mvc绑定对象String转Date解决入参不能是Date的问题

    使用spring的mvc,直接将页面参数绑定到对象中,对象中有属性为Date时会报错,此时需要处理下. 同样的,其他的需要处理的类型也可以用这种方法. 在controller中加入代码 @InitBi ...

  9. Python——面向对象、绑定对象、组合

    1. 面向过程VS面向对象 (1)面向过程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复杂 ...

随机推荐

  1. Yii登录验证和全局访问用户ID

    注意:Yii默认的代码,Yii::app()->user->id返回的不是我们想要的用户ID,而是用户名.因此在useridentity类中要用一个变量来存储登录用户的ID,然后重载get ...

  2. CLR值类型和引用类型

    知识点:引用类型.值类型.装箱.拆箱 CLR支持两种类型:引用类型和值类型.引用类型在堆上分配内存,值类型在线程栈上分配内存.值类型与引用类型如下所示: 值类型对象有两种表示形式:未装箱和已装箱.将一 ...

  3. PHP Tools for VS2017 key/破解 [搬运]

    看看结果 搬运地址 :  (自己敲吧...) 这里面破解的只有一年 时间可以在文中提供的 ------------------------------------------------------- ...

  4. 为什么中国出不了facebook和Twitter?

    我们坐拥全球最大基数的网民,我们拥有让人骄傲的四大发明,我们有有流传全世界的孙子兵法,可是在互联网时代,我们却落后了.互联网可以说是江山人才辈辈出,各领风骚三两年. 让我们来简单地回顾一下近几年的互联 ...

  5. eclipse解决git冲突举例

    本地修改了两个文件,提交时提示有冲突,想来应该是没有从远程仓库下载最新代码导致的.通过右击项目 -> Team -> Sychronized WorkSpace,比较本地仓库和远程仓库的异 ...

  6. oracle11g,安装失败,提示找不到文件,win7 64位下报错

    提示: 未找到文件 E:\app\Administrator\product\11.2.0\dbhome_5\owb\external\oc4j_applications\applications\W ...

  7. linux下创建与删除用户详细步骤 ***

    linux下用户的操作还是相对容易理解的,基本操作如下: 1.新增用户 只有root用户能创建新用户 #useradd user1 新建后将会在/home目录下生成一个与用户名相同的用户主目录.同时会 ...

  8. Avalon总线概述

    Nios系统的所有外设都是通过Avalon总线与Nios CPU相接的,Avalon总线是一种协议较为简单的片内总线,Nios通过Avalon总线与外界进行数据交换. Avalon总线接口分类 可分为 ...

  9. Quartz 用 cron 表达式存放执行计划

    Quartz 用 cron 表达式存放执行计划.引用了 cron 表达式的 CronTrigger 在计划的时间里会与 job 关联上. 1.Quartz cron 表达式支持七个域如下: 名称 是否 ...

  10. md5加密小程序

    #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import hashlib m = hashlib.md5() m.updat ...