能否将原生JavaScript的call和bind方法改写为长尾词实现?
- 内容介绍
- 文章标签
- 相关推荐
本文共计751个文字,预计阅读时间需要4分钟。
JavaScript 手动实现 call 和 bind 是编程中常见的话题。网上确实有很多关于如何自己实现 call 和 bind 的文章。然而,call 和 bind 的原理并非像某些文章描述的那样简单。
今天,我就来揭开这些原理的真相。首先,我们需要明确 call 和 bind 的真正作用。
call 和 bind 都是为了改变函数的 this 指向而设计的。具体来说:
- call 方法允许你调用一个对象的一个方法,同时传入一个对象的上下文(即 this 指向的对象)。- bind 方法则返回一个新函数,当这个新函数被调用时,其 this 指向由 bind 方法指定的对象。
接下来,让我们来看看这些方法的实际实现原理。
call 的实现原理
1. 创建一个临时的函数,这个函数的 this 指向指定的对象。
2.将要调用的函数的参数作为参数传递给这个临时的函数。
3.调用临时的函数,并返回其返回值。
bind 的实现原理
1. 创建一个临时的函数,这个函数的 this 指向由 bind 方法指定的对象。
2.将要调用的函数的参数作为参数传递给这个临时的函数。
3.返回这个临时的函数。
简单来说,call 和 bind 的实现都是基于闭包和函数的 this 指向原理。希望这篇文章能帮助你更好地理解 call 和 bind 的原理。
js手动实现call和bind都是谎言
网上有很多关于说自己实现call和bind的原理的文章,然而call和bind的原理真如他们所说的那样吗?今天就让我来推翻这些所谓的”原理“,揭开谎言下的真相。
首先看看网上对call的实现:
// 手写 call Function.prototype.mycall = function (context) { context = context || window; context.fn = this; const args = [...arguments].slice(1); const result = context.fn(...args); // 执行fn时上下文context已被修改,不是我们所期望的call delete context.fn; return result; } function show() { console.log(this); } show.mycall({haha:122});
以上代码的执行结果是
如你所见,这样实现的call并不是我们所期望的那样。
对比于函数自带的call:
show.call({haha:122})
其结果为
分析其原因不难发现,根据函数mycall,执行context.fn(...args)之前修改了上下文context,所以执行fn时所使用的上下文是修改后的上下文,导致与预期结果相差甚远。
核心
而且,往更深的层次去思考,call绝不是这样(或类似这样)实现的,call是底层语言为浏览器封装好的函数,是绝对不能也没必要用js强行模仿的。
综上,js模仿call和bind绝对没有get到底层原理,这样的模仿只能用于娱乐而已,没有实际价值。bind和call类似,这里就不赘述了。
本文共计751个文字,预计阅读时间需要4分钟。
JavaScript 手动实现 call 和 bind 是编程中常见的话题。网上确实有很多关于如何自己实现 call 和 bind 的文章。然而,call 和 bind 的原理并非像某些文章描述的那样简单。
今天,我就来揭开这些原理的真相。首先,我们需要明确 call 和 bind 的真正作用。
call 和 bind 都是为了改变函数的 this 指向而设计的。具体来说:
- call 方法允许你调用一个对象的一个方法,同时传入一个对象的上下文(即 this 指向的对象)。- bind 方法则返回一个新函数,当这个新函数被调用时,其 this 指向由 bind 方法指定的对象。
接下来,让我们来看看这些方法的实际实现原理。
call 的实现原理
1. 创建一个临时的函数,这个函数的 this 指向指定的对象。
2.将要调用的函数的参数作为参数传递给这个临时的函数。
3.调用临时的函数,并返回其返回值。
bind 的实现原理
1. 创建一个临时的函数,这个函数的 this 指向由 bind 方法指定的对象。
2.将要调用的函数的参数作为参数传递给这个临时的函数。
3.返回这个临时的函数。
简单来说,call 和 bind 的实现都是基于闭包和函数的 this 指向原理。希望这篇文章能帮助你更好地理解 call 和 bind 的原理。
js手动实现call和bind都是谎言
网上有很多关于说自己实现call和bind的原理的文章,然而call和bind的原理真如他们所说的那样吗?今天就让我来推翻这些所谓的”原理“,揭开谎言下的真相。
首先看看网上对call的实现:
// 手写 call Function.prototype.mycall = function (context) { context = context || window; context.fn = this; const args = [...arguments].slice(1); const result = context.fn(...args); // 执行fn时上下文context已被修改,不是我们所期望的call delete context.fn; return result; } function show() { console.log(this); } show.mycall({haha:122});
以上代码的执行结果是
如你所见,这样实现的call并不是我们所期望的那样。
对比于函数自带的call:
show.call({haha:122})
其结果为
分析其原因不难发现,根据函数mycall,执行context.fn(...args)之前修改了上下文context,所以执行fn时所使用的上下文是修改后的上下文,导致与预期结果相差甚远。
核心
而且,往更深的层次去思考,call绝不是这样(或类似这样)实现的,call是底层语言为浏览器封装好的函数,是绝对不能也没必要用js强行模仿的。
综上,js模仿call和bind绝对没有get到底层原理,这样的模仿只能用于娱乐而已,没有实际价值。bind和call类似,这里就不赘述了。

