函数中的 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. 调试VBA程序常用方法

    在中断模式下(ctrl+Break键),可以做: 1.执行    工具----选项----编辑器----勾选“自动显示数据提示” 则当用鼠标悬停在变量或表达式上时,会出现提示窗口,显示其名称和值! 2 ...

  2. js插件大全 jquery插件大全

    CocoaUI - 一个强大的 iOS UI 框架 http://www.cocoaui.com/ tab,slider,轮播不错的说 http://www.superslide2.com/index ...

  3. CentOS 7 : Docker私有仓库搭建和使用

    系统环境: CentOS 7.2 192.168.0.179:docker仓库 192.168.0.60:客户端 安装并启动docker yum -y install docker systemctl ...

  4. 不用jq的异步数据获取

    function LoadData(url, sign) {             var message = "";             if (sign == " ...

  5. jinja2的一些用法

    1.split用法以及乘法运算 {% set user_list=l.users.split(',') %} <tr> <td>{{ l.name }}</td> ...

  6. rbenv配置

    git clone https://github.com/rbenv/rbenv.git ~/.rbenv # 用来编译安装 ruby git clone git://github.com/sstep ...

  7. optimize table tablename

    optimize 优化表OPTIMIZE 命令支持的引擎MyIsam, InnoDB, ARCHVE当对表有大量的增删改操作时,需要用optimize对表进行优化,可以减少空间与提高I/O性能,命令o ...

  8. java写基础的九九乘法表

    package com.aaa; public class Xox { public static void main(String[] args) { for (int i = 1; i <= ...

  9. fatal: read error: Connection reset by peer解决办法

    标签(空格分隔): ceph源码安装,git 问题描述: 源码安装ceph,克隆代码时提示如下错误: [root@localhost ~]# git clone git://github.com/ce ...

  10. PHP面向对象深入研究之【命名空间】与【自动加载类】

    命名空间 避免类名重复,而产生错误. <?php require_once "useful/Outputter.php"; class Outputter { // outp ...