原文地址 https://www.cnblogs.com/wangfupeng1988/p/4000798.html
1.原型的灵活性--对象是所有属性的集合,对象属性可以随时改动。函数也是对象的一种,所以函数也可以改动属性,新增或者修改,如jQuery
![](https://img.haomeiwen.com/i12858847/4c440f9f84dabc13.png)
其次,如果继承的方法不合适,可以做出修改。
![](https://img.haomeiwen.com/i12858847/0e438adf72ebead0.png)
如上图,Object和Array的toString()方法不一样。肯定是Array.prototype.toString()方法做了修改。
同理,我也可以自定义一个函数,并自己去修改prototype.toString()方法。
![](https://img.haomeiwen.com/i12858847/fa4e8acdf2477e28.png)
2.简述“执行上下文”(上)
执行上下文 (也叫 执行上下文环境)
通常在一段js代码真正一句一句运行之前,浏览器已经做了一些“准备工作”,其中就包括对变量的声明,而不是赋值。变量赋值是在赋值语句执行的时候进行的。(变量声明提前,赋值留在原地)
看代码
![](https://img.haomeiwen.com/i12858847/4191df3f9a7ca37d.png)
对于变量 只是声明(并没有赋值),而此种情况直接给this赋值。这也是“准备工作”情况要做的事情之一。
还有一种情况
![](https://img.haomeiwen.com/i12858847/185442aace2bbb5d.png)
总结一下,js在“准备工作”中完成了哪些工作:
变量、函数表达式——变量声明,默认赋值为undefined;
this——赋值;
函数声明——赋值;
这三种数据的准备情况我们称之为“执行上下文”或者“执行上下文环境”。
其实,javascript在执行一个代码段之前,都会进行这些“准备工作”来生成执行上下文。其中“代码段”又分三种情况——全局代码,函数体,eval代码(eval() 函数可计算某个字符串,并执行其中的 js 代码。)。
这里解释一下为什么代码段分为这三种。
所谓“代码段”就是一段文本形式的代码。
首先,全局代码是一种,就是手写文本到<script>标签里面的。
![](https://img.haomeiwen.com/i12858847/863b78a078eaa0e0.png)
其次,eval代码接收的也是一段文本形式的代码。
![](https://img.haomeiwen.com/i12858847/7047eeb47a02bc3a.png)
最后,函数体是代码段是因为函数在创建时,本质上是 new Function(…) 得来的,其中需要传入一个文本形式的参数作为函数体。
![](https://img.haomeiwen.com/i12858847/ba5e9459efd01f65.png)
3.简述“执行上下文”(下)
执行上下文环境中准备工作(定义数据):
变量、函数表达式——变量声明,默认赋值为undefined;
this——赋值;
函数声明——赋值;
如果是函数,除了上面数据的还会有其他的,看代码
![](https://img.haomeiwen.com/i12858847/967f18a13a2e3f64.png)
以上代码展示了在函数体的语句执行之前,arguments变量和函数的参数都已经被赋值。从这里可以看出,函数每被调用一次,都会产生一个新的执行上下文环境。因为不同的调用可能就会有不同的参数。
函数在定义的时候(不是调用的时候),就已经确定了函数体内部自由变量的作用域(后面讲)。
全局代码的上下文环境数据内容为:
![](https://img.haomeiwen.com/i12858847/fa729c0975c53116.png)
网友评论