学习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 相关文章推荐
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
Mar 14 Javascript
jQuery easyui datagrid动态查询数据实例讲解
Feb 26 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
Nov 10 Javascript
JavaScript File API实现文件上传预览
Feb 02 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
Apr 30 Javascript
VSCode配置react开发环境的步骤
Dec 27 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
May 31 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
Sep 16 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
Jan 27 Javascript
详解vue2.6插槽更新v-slot用法总结
Mar 09 Javascript
swiper Scrollbar滚动条组件详解
Sep 08 Javascript
如何在wxml中直接写js代码(wxs)
Nov 14 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
文件上传的实现
2006/10/09 PHP
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
php 代码优化之经典示例
2011/03/24 PHP
php使用codebase生成随机数
2014/03/25 PHP
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
PHP实现Redis单据锁以及防止并发重复写入
2018/04/10 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
jQuery中常用的遍历函数用法实例总结
2015/09/01 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
深入分析javascript中的错误处理机制
2016/07/17 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
[02:24]DOTA2亚洲邀请赛 NAVI战队出场宣传片
2015/02/07 DOTA
使用Python下载Bing图片(代码)
2013/11/07 Python
python文件比较示例分享
2014/01/10 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
python实现三次样条插值
2018/12/17 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
python 读取串口数据的示例
2020/11/09 Python
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
暑期社会实践方案
2014/02/05 职场文书
新年寄语大全
2014/04/12 职场文书
如何写求职信
2014/05/24 职场文书
员工保密协议书
2014/09/27 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
python实现简单区块链结构
2021/04/25 Python