前端JavaScript基础训练系列三十六: API调用的“上下文”

var obj = { a:2
};
var bar = foo.bind( obj );
var b = bar( 3 ); // 2 3 console.log( b ); // 5

bind(…) 会返回一个硬编码的新函数,它会把你指定的参数设置为 this 的上下文并调用 原始函数。

2. API调用的“上下文”

第三方库的许多函数,以及 JavaScript 语言和宿主环境中许多新的内置函数,都提供了一 个可选的参数,通常被称为“上下文”(context),其作用和 bind(…) 一样,确保你的回调 函数使用指定的 this。
举例来说:

function foo(el) {
console.log( el, this.id );
}
var obj = {
id: "awesome"
};
// 调用 foo(..) 时把 this 绑定到 obj [1, 2, 3].forEach( foo, obj );
// 1 awesome 2 awesome 3 awesome

这些函数实际上就是通过 call(…) 或者 apply(…) 实现了显式绑定,这样你可以少写一些 代码。

new绑定

这是第四条也是最后一条 this 的绑定规则,在讲解它之前我们首先需要澄清一个非常常见
的关于 JavaScript 中函数和对象的误解。 在传统的面向类的语言中,“构造函数”是类中的一些特殊方法,使用 new 初始化类时会
调用类中的构造函数。通常的形式是这样的:

    something = new MyClass(..);

JavaScript 也有一个 new 操作符,使用方法看起来也和那些面向类的语言一样,绝大多数开 发者都认为 JavaScript 中 new 的机制也和那些语言一样。然而,JavaScript 中 new 的机制实 际上和面向类的语言完全不同。

首先我们重新定义一下 JavaScript 中的“构造函数”。在 JavaScript 中,构造函数只是一些 使用 new 操作符时被调用的函数。它们并不会属于某个类,也不会实例化一个类。实际上, 它们甚至都不能说是一种特殊的函数类型,它们只是被 new 操作符调用的普通函数而已。
举例来说,思考一下 Number(…) 作为构造函数时的行为,ES5.1 中这样描述它:

Number 构造函数

当 Number 在 new 表达式中被调用时,它是一个构造函数:它会初始化新创建的 对象。
所以,包括内置对象函数(比如 Number(…),详情请查看第 3 章)在内的所有函数都可 以用 new 来调用,这种函数调用被称为构造函数调用。这里有一个重要但是非常细微的区 别:实际上并不存在所谓的“构造函数”,只有对于函数的“构造调用”。
使用 new 来调用函数,或者说发生构造函数调用时,会自动执行下面的操作。

    1. 创建(或者说构造)一个全新的对象。
    1. 这个新对象会被执行[[Prototype]]连接。
    1. 这个新对象会绑定到函数调用的this。
    1. 如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象。
      我们现在关心的是第 1 步、第 3 步、第 4 步,所以暂时跳过第 2 步,第 5 章会详细介绍它。 思考下面的代码:
function foo(a) { this.a = a;
}
var bar = new foo(2); console.log( bar.a ); // 2

使用 new 来调用 foo(…) 时,我们会构造一个新对象并把它绑定到 foo(…) 调用中的 this 上。new 是最后一种可以影响函数调用时 this 绑定行为的方法,我们称之为 new 绑定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值