00:00
Hello,大家好,那从这个小节开始呢,我们来实现几个与函数相关的API。首先这个小节我们来实现一下Co函数。Co函数呢?它的作用与函数原型对象上面的扣方法。作用是一模一样的。它可以呢,改变函数运行时的Z值。并且得到函数运行的执行结果。下边我们就来对它做一个代码实现。首先先把结构搭一下。这是我们要目标封装的Co函数。它接住几个参数,首先第一个是我们要执行的函数。第二个呢,是函数运行时this指向的对象。那么从第三个参数开始呢?就是函数运行时的参数了。啊,那么这个时候我们用一个参数来表示。好了。
01:01
这个行参我们就已经写完了。下边呢,我们开始进行功能的一个实现。如何去改变函数类似的指向,然后执行函数呢?我们想一想,发现这个事情好像不是特别的容易。不过呢,我们可以变相来实现这个效果。怎么个变相法呢?我们可以这样来做为obj这个对象。添加零食的方法。OBj.tmp等于一个FN。大家可以想象一下这样的一个结构。此时,OJ的身上有了一个与FN功能一样的函数。那么这个时候的话,我们就可以呢,不去调FN,而去调TP这个方法来得到与FN执行一样的效果。并且在这种情况下。Tmp方法在执行时,它内部Z的值是指向OB的。
02:04
所以就变相了实现了this指向obj这样一个效果。调用tmp这个方法。并且我们来获取一下它的一个执行结果。这地方还缺点东西。缺什么东西呢?就是缺参数。参数呢,是函数运行时的实参。所以说我们应该把这几个参数呢,放到。T方法里边。OK,搞定。那么搞定之后呢?我们在这个对象身上呢,还有这个tmp临时方法,我们需要做一个复原。所以要删除。Tmp这个方法。那么如何删除呢?我们可以借助于delete的关键字来做一个删除。
03:00
最后呢,返回执行结果。Return一下result搞定。这里呢?我们再往前迈一步。与。这个函数原型上面那个括方法呢。做的更加接近一些。我们点开MDN的文档。大家看这里有一句话。如果函数呢,处于非严格模式下。则这个对象指定为囊货,On fine的时候呢,会自动让这个对象指向全局对象。所以在这呢,我们可以做一个判断。如果OB间要是等于一个find。或者obj等于一个none。这个时候,我们就让OJ指向全局对象。那么,全局对象等于谁呢?有同学可能会想说,等于window。啊,但是呢,如果在note GS环境下边的话,全局对象就不是window了,而是global。
04:05
这里的话我们可以用一个变量来表示,就是格罗伯。这是ES11新推出来一个特性。用它呢来指向全局对象。战略的话呢,我们整个的功能就已经实现了。接下来的话呢,我们对这个函数做一下测试。怎么测试呢?我们新建一个HTML文件。然后把这个GS文件引到HTML当中来。我们。通过这样的方式来做一个测试。然后下边我们把加上。首先呢,咱们先声明一个函数。待会儿呢,要执行。然后里边呢,有两个行参。Return一下A加上B。
05:00
然后呢,加上一个。z.C。上面呢,这个位置咱们再输出一下。This的值。啊,先说明一个函数。然后呢,再声明一个对象,因为待会儿呢,This要指向到一个单独的对象里边。所以我们这样来做一下。C等于一个521。然后呢,顺便呢,再给全局上面也加一个属性。window.c。等于一个1314。这样做是为了测试一下。如果我们在调的时候呢,这个对象并没有去使用单独的,而是传列一个unDeFined,或者说none。看他的一个表现是怎么样的。下面我们开始执行Co函数。我们的目标是这样子的。直行ad。并且改变它运行时this的指向为obj。
06:00
如何来做呢?第一个参数为函数abd。第二个参数为this指向的对象OB。那么第三个参数和第四个参数呢,就是这个ad函数运行时的一个时参了。我们这里传一个十。20。好,看一看这个结果。它的正确结果的话应该是。Obj是521加上30,应该是551。好,我们来检测一下。点开浏览器。先看这551没有问题。在这儿可能会有会有一个有一个疑惑啊,就是诶这有个tmp,这个tmp怎么回事。简单解释一下。这里主要是因为呢,函数的执行是在这个位置执行的。大家想一下啊,是在这个位置执行的,你看ad。传给了FN。
07:00
FN,那又赋值给tmp。然后在这儿去执行。所以说函数的执行是在这个位置执行的。但是在这个位置执行的时候呢。我们还没有去删除对象身上那个tmp属性。所以说在这个位置打印的时候,我们还是可以看到tmp这个属性的。所以说呢,这个地方的话,它的显示会为先。啊,就是这样一个特点。不过在运行完这个函数之后,你再去打印O接这个对象。你会发现他还是原来那个样子。刷新一点。这是这一块给大家做一个解释。那么这一块完成之后,咱们再去。做一下另外一个测试。就是我这里呢,不写单独对象了,我就写一个那。啊,参数这块换成30。四十来看看效果。我们先算一算,它最终正确结果应该为多少。
08:02
啊,首先这里为闹。This的话是全局的。全局的C是1314。加上70,应该是1384。好了,看效果怎么样。刷新页面1384。This指向window,没有问题。好了,那到这儿的话,Co函数的一个封装实现,我们就已经完成了。
我来说两句