尽管说用JS非常多年了,可是却一直停留在肤浅的阶段,对JS的机制原理依旧是一知半解,比如:闭包。尽管能说出一二。却不能说出三四,确实羞愧。近期恶补一番。并将比較与大家分享,希望对大家有些帮助。

闭包

老概念,在JS编程中我们可能在不经意间就用到了它,仅仅是我们不知道而已。

首先呢,闭包并非一个函数或者类型。而是一直语言机制,假设硬要做个类比的话。我认为它应该属于“继承”这类型的语言机制。

在JS里面,函数外部是不能直接调用函数内部的变量。假设我们非要调用它们的话,那你就须要闭包,举个样例:

假设我们想在outerFunc外部调用color变量,那我们就得使用闭包机制,调用方式例如以下

function outerFunc()
{
var color='red';
function innerFunc(c)
{
color=c;
alert(color);
}
return innerFunc;
} var tmp=outerFunc();
tmp('green'); //green

This

假设我们调用的对象分别存在多个定义域里面,比如:全局或局部,而且我们在用它的时候还加上了Thiskeyword,那大家就要小心了。这时候我们就须要分辨我们调用的对象究竟是全局的呢,还是局部的呢?

第一次调用返回的结果是一个包括this.name的函数体,可是我们运行它的定义域确实在全局,全部它会返回’the window'。

可是第二次调用呢,它的定义域是局部,所以它返回'my object',第三次调用返回的是闭包,所以它的结果当然是它的局部变量值‘my object2'。

 var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function () {
return function () {
return this.name;
};
}
}; var object2 = {
name: "My Object2",
age: 22,
gender:'Femal',
getNameFunc: function () {
var name = this.name;
return function () {
return name;
};
}
}; alert(object.getNameFunc()());
object.show = object.getNameFunc();
alert(object.show());
alert(object2.getNameFunc()());

Call 和 Apply

这两keyword的使用和This有非常大的关系,它们能模拟对象的运行环节,对上面的样例来说,假设我们对第一调用做例如以下改动,那么它返回的结果将是’My Object‘。

        alert(object.getNameFunc().call(object));
alert(object.getNameFunc().apply(object));

首先呢,object.getNameFunc()返回的是一个函数体。其次呢,我们通过call和apply在object的定义域内运行返回的函数体,所以返回的值也就不一样了。

Prototype

prototype是JS对象的一个内部原型机制。我们能够给它加入属性或方法,这些内容都能被它相应的对象所识别。

prototype在JS面向对象的编程中用的比較多,基本上都用它来实现对象的继承机制,详细看以下样例。

 function person()
{
this.sex = 'male';
this.age = 21; }
person.prototype.introduce = function () {
console.log('im a ' + this.sex + ' and im ' + this.age + ' years old');
} function Jim()
{
this.name = 'Jim';
} Jim.prototype = new person(); var people = new Jim();
people.introduce();

在这里呢,我们成功的将person的全部属性赋值给Jim.prototype了,当然这些东西对Jim对象是全然可见的,大家看,是不是通过这样的方式非常实现JS的单项继承呢?

最新文章

  1. PIC32MZ tutorial -- OC Interrupt
  2. windbg命令----!idt
  3. 使用JMeter创建FTP测试计划
  4. eclipse 最全快捷键(网络收集)
  5. PowerDesigner中转换物理模型时的命名转换
  6. 几种解析xml方式的比较
  7. sendmail服务器的安装
  8. html5画饼形图
  9. [转载] Dubbo实现RPC调用使用入门
  10. Shell读取配置文件的方法
  11. 热烈庆祝自已厉精13年开发的 DB查询分析器 7.01(最新版本) 在中关村在线本月获得近6000次的下载量
  12. centos7下安装docker(13.2容器数据共享)
  13. WEB 小案例 -- 网上书城(四)
  14. 使用import简化spring的配置 spring import 标签的解析 使用import或加载spring配置时,报错误There is no ID/IDREF 多个Spring配置文件import resource路径配置
  15. c++友元函數---16
  16. 06_常用 Linux 命令的基本使用
  17. 常见几种校验方法(CS和校验、CRC16、CRC32、BCC异或校验)
  18. h5请求跨域问题Access-Control-Allow-Origin解决跨域
  19. android 使用动画 Button移动后不响应点击事件的解决办法
  20. leetcode 235 236 二叉树两个节点的最近公共祖先

热门文章

  1. js内置对象——Math
  2. CSS学习(四)
  3. [Python]threading local 线程局部变量小測试
  4. 通过 KVM+virt-manager配置双屏虚拟机(两套键盘。鼠标)
  5. Python 异常(Exception)
  6. [JZOJ 5912] [NOIP2018模拟10.18] VanUSee 解题报告 (KMP+博弈)
  7. 解决JavaScript浮点数(小数) 运算出现Bug的方法
  8. System.IO.FileLoadException异常
  9. bioinformaitcs的latex版本参考文献填坑
  10. java.lang.NoClassDefFoundError: org/springframework/dao/support/PersistenceE解决方法