学习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 相关文章推荐
JS 仿腾讯发表微博的效果代码
Dec 25 Javascript
jquery结婚电子请柬特效源码分享
Aug 21 Javascript
通过点击jqgrid表格弹出需要的表格数据
Dec 02 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
Dec 11 Javascript
JavaScript数据结构之数组的表示方法示例
Apr 12 Javascript
AngularJS 的$timeout服务示例代码
Sep 21 Javascript
原生javascript实现文件异步上传的实例讲解
Oct 26 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
Sep 01 Javascript
JSONP原理及应用实例详解
Sep 13 Javascript
微信小程序webview 脚手架使用详解
Jul 22 Javascript
js实现网页版贪吃蛇游戏
Feb 22 Javascript
elementui实现预览图片组件二次封装
Dec 29 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错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
2014/05/04 PHP
php动态函数调用方法
2015/05/21 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
ionic环境配置及问题详解
2017/06/27 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
[35:27]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第二场 10.29
2020/10/29 DOTA
Python进阶篇之字典操作总结
2016/11/16 Python
简单谈谈Python流程控制语句
2016/12/04 Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
2017/05/24 Python
对python的unittest架构公共参数token提取方法详解
2018/12/17 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
2019/08/08 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
Aosom西班牙:家具在线商店
2020/06/11 全球购物
英语商务邀请函范文
2014/01/16 职场文书
致裁判员加油稿
2014/02/08 职场文书
法律七进实施方案
2014/03/15 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
2017元旦晚会开幕词
2016/03/03 职场文书
人力资源部工作计划
2019/05/14 职场文书