学习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 学习之旅 (2)
Feb 05 Javascript
学习ExtJS 访问容器对象
Oct 07 Javascript
javascript 基础篇2 数据类型,语句,函数
Mar 14 Javascript
Json序列化和反序列化方法解析
Dec 19 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
网站基于flash实现的Banner图切换效果代码
Oct 14 Javascript
移动Web中图片自适应的两种JavaScript解决方法
Jun 18 Javascript
浅谈JavaScript函数的四种存在形态
Jun 08 Javascript
Bootstrap CSS组件之导航条(navbar)
Dec 17 Javascript
JS滚动到指定位置导航栏固定顶部
Jul 03 Javascript
fetch 如何实现请求数据
Dec 20 Javascript
微信小程序仿通讯录功能
Apr 09 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
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
老生常谈PHP中的数据结构:DS扩展
2017/07/17 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
vue中用动态组件实现选项卡切换效果
2017/03/25 Javascript
使用svg实现动态时钟效果
2018/07/17 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
在微信小程序中使用mqtt服务的方法
2019/12/13 Javascript
js里面的变量范围分享
2020/07/18 Javascript
Vue自定义全局弹窗组件操作
2020/08/11 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
Python使用django框架实现多人在线匿名聊天的小程序
2017/11/29 Python
读取本地json文件,解析json(实例讲解)
2017/12/06 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
详解Python学习之安装pandas
2019/04/16 Python
Python 分发包中添加额外文件的方法
2019/08/16 Python
Python实现分数序列求和
2020/02/25 Python
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
西式婚礼证婚词
2014/01/12 职场文书
检查接待方案
2014/02/27 职场文书
国际商务专业毕业生自我鉴定2014
2014/09/27 职场文书
2014年残疾人工作总结
2014/12/06 职场文书
2015年度合同管理工作总结
2015/05/22 职场文书
深入浅析python3 依赖倒置原则(示例代码)
2021/07/09 Python
搭建Yolov5服务器
2022/04/30 Servers