学习javascript的闭包,原型,和匿名函数之旅


Posted in Javascript onOctober 18, 2015

本文通过示例给大家介绍javascript的闭包,原型,和匿名函数,具体详情请看下文。

一 .>关于闭包

理解闭包 需要的知识

1.变量的作用域

例1:

var n =99; //建立函数外的全局变量
function readA(){
  alert(n); //读取全局变量
}

readA(); //执行此函数

例2:

function readB(){
  var c = 9;
  function readC(){
    console.log(c); //ok c可见
  }
  return readC;
}
alert(c); //error c is not defined.

    note:  函数内部声明变量c时,一定要加上 var,否则 c会成为一个全局变量

所以函数内可见全局变量,函数内的局部变量却对外不可见
js的作用域是链式的,父对象里的变量总对子对象可见,子对象的对象却对父对象不可见
当我们要获取函数内的内部变量

于是有了例3:

function readB(){
  var c = 9;
  function readC(){
    console.log(c);
  }
  return readC();
}
readB();

闭包很类似基于此做了一个变式

function readB(){
  var c = 9;
  function readC(){
    console.log(c);
  }
  return readC;
}
var res = readB();
res();

note:

1.慎用闭包,注意内存占用,因为它会保存父函数的状态
2.不要随便改变父函数内部变量的值

理解闭包

   note: this 指包含它的函数被执行时所属的对象

例1:

var name = "The Window";

var object = {
  name : "My Object",

getNameFunc : function(){  //此时this (这个执行函数)是属于object对象的,是object对象下的一个属性的值

  return function(){   //此时this (这个执行函数)是一个匿名函数,从根对象window生成,是属于window


  return this.name;


};

}
};
console.log(object.getNameFunc()()); //the window

例2:

var name = "The Window";

var object = {
  name : "My Object",

  getNameFunc : function(){
    var that = this;
  return function(){
  
  return that.name;
  
};

  }
};
console.log(object.getNameFunc()());  //My Object

二 .>匿名函数

直接定义一个匿名函数 然后调用这个匿名函数,这种形式在jquery插件的定义时很常见

1.通过函数字母量的方式. 先声明一个匿名函数,然后执行它

( function(){
  console.log('excute self');
}) ();

2.通过优先表达式的方式 , 由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数

(
  function () {
    alert(2);
  }
  ()
);

3.void操作符 用void操作符去执行一个没有用圆括号包围的一个单独操作数

void function(){ console.log('void') } ();

三 .>关于prototype

原型 prototype

理解js中的protitype首先需要明白js的面向对象设计

function People(name){
  this.name = name;

  console.log(this); //Window 或者 object { name: 'xxx' }
  this.introduce = function(){  //实例对象方法
    console.log(this.name);
  }
}
new People('leon').introduce();
//这里有一个非常有趣的现象,结合前面的来看的话,
//首先function people里的this指向的默认是Window对象
//当 调用 People();时 this 输出为 Window对象
//但一旦调用new People('xx')时, this 输出为 {name:'xx'}
//其实也很好理解,一旦new ,便新建了一个对象

实例对象方法只能这样 new People('leon').introduce(); 调用 因为它使用前必须初始化

类的对象的静态方法

var People = {}; //等于一个对象 {} 或者 function 数组都可以 此时People需要是引用类型
People.sayhi = function(to_who){
  console.log('hi '+ to_who);
}
People.sayhi('lee'); //调用时这样调用

原型方法

var People = function(){};       // People 必须为一个 function(){} 即为一个类,不能是对象或值类型或其他引用类型
People.prototype.meet = function(meet_who) {
  console.log('I am '+this.name + ',going to meet ' + meet_who);
};
new People('lee').meet('xx');

原型方法只能由该类的对象 调用

 A.prototype = new B();

原型看起来很像继承,但其实不是,它更像clone更准确

如果出现了父类和子类出现了重名的属性,采取就近原则,如果找不到一级一级向上找,如果要指定调用上级的属性,使用call方法

extendClass.prototype = new baseClass();
var instance = new extendClass();
var baseinstance = new baseClass();
baseinstance.showMsg.call(instance);
obj1.func.call(obj);

以上内容是小编给大家分享的学习javascript的闭包,原型,和匿名函数之旅,希望对大家有用。

Javascript 相关文章推荐
怎么清空javascript数组
May 11 Javascript
js导出table到excel同时兼容FF和IE示例
Sep 03 Javascript
jquery实现的图片点击滚动效果
Apr 29 Javascript
简单介绍JavaScript中字符串创建的基本方法
Jul 07 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
Mar 10 Javascript
jQuery元素选择器实例代码
Feb 06 Javascript
ES6新数据结构Map功能与用法示例
Mar 31 Javascript
详解用函数式编程对JavaScript进行断舍离
Sep 18 Javascript
详解如何优雅地在React项目中使用Redux
Dec 28 Javascript
详解React的回调渲染模式
Sep 10 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
Feb 15 Javascript
Javascript中的数据类型之旅
Oct 18 #Javascript
谈谈JavaScript自定义回调函数
Oct 18 #Javascript
JS实现的网页背景闪电闪烁效果代码
Oct 17 #Javascript
JavaScript实现点击按钮切换网页背景色的方法
Oct 17 #Javascript
JavaScript实现的背景自动变色代码
Oct 17 #Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
Oct 17 #Javascript
利用jQuery和CSS将背景图片拉伸
Oct 16 #Javascript
You might like
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
有关PHP性能优化的介绍
2013/06/20 PHP
destoon公司主页模板风格的添加方法
2014/06/20 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
2016/12/15 PHP
filemanage功能中用到的common.js
2007/04/08 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
瀑布流的实现方式(原生js+jquery+css3)
2020/06/28 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
Vue分页器实现原理详解
2019/06/28 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
解决新django中的path不能使用正则表达式的问题
2018/12/18 Python
django模板结构优化的方法
2019/02/28 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
Html5 localStorage入门教程
2018/04/26 HTML / CSS
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
几个人围成一圈的问题
2013/09/26 面试题
银行实习自我鉴定
2013/10/12 职场文书
会计电算化大学生职业规划书
2014/02/05 职场文书
学校募捐倡议书
2014/05/14 职场文书
社区两委对照检查材料
2014/08/23 职场文书
小学生班干部竞选稿
2015/11/20 职场文书
JavaScript组合继承详解
2021/11/07 Javascript